Java 抽象类(abstract class)和接口(interface)异同

一、抽象类(abstract class)

了解抽象类之前,先了解一下抽象方法。在Java中,可以通过把类和类中的某些方法声明为abstract(abstract只能修饰类或者方法,不能用来修饰属性)来表示一个类是抽象类。抽象方法是一种特殊的方法 — 它只有声明,而没有具体的实现,其声明的格式如:

abstract void fun();

如果一个类含有抽象方法,则称该类为抽象类,因为抽象类中含有无具体实现的方法,所以不能用抽象类创建对象。抽象类就是为了继承而存在的,对于一个父类,若它的某个方法在父类中实现出来没有任何意义,必须根据子类的实际需求来进行不同的实现,那么就可以将这个方法声明为abstract方法,此时这个类就成为了抽象类。

[public] abstract class ClassName {
      abstract void fun();          
}

二、接口(interface)

接口可以含有变量和方法。但是要注意,接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会编译报错),而方法会被隐式地指定文public abstract方法(并且只能是public abstract方法,private、protected、static、final等修饰都会编译报错)。并且接口中所有方法都不能有具体实现,也就是接口中的方法都必须是抽象方法。接口是一种比抽象类更加“抽象”的类型,且一般不在接口中定义变量。

[public] abstract interface InterfaceName {
      abstract void fun();          
}

 三、抽象类和接口异同

相同点:

1)都不能被实例化;

2)接口的实现类和抽象类的子类都只有在实现了接口或抽象类中的抽象方法才可以被实例化。

不同点:

1)抽象类可以提供成员方法的实现细节,而接口中只能存在public abstract方法;

2)抽象类中成员变量可以是各种类型,而接口中的成员变量只能是public static final类型(且必须要有初始值);

3)接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;

4)一个类只能继承一个抽象类,而一个类却可以实现多个接口,因此使用接口可以间接地达到多重继承的目的;

5)接口强调的是特定功能的实现(has-a关系),而抽象类强调的是所属关系(is-a关系);

6)接口被运用于实现比较常用的功能,便于日后维护或者删除方法,而抽象类更倾向于充当公共类的角色,不适用于日后重新对里面的代码进行修改。

 

posted @ 2018-03-23 13:50  DIMSUMBOY  阅读(188)  评论(0编辑  收藏  举报