抽象方法:仅有声明而没有方法体。下面是抽象方法声明所采用的语法:
abstract void f();
抽象类:包含抽象方法的类叫做抽象类。如果一个类包含一个或多个抽象方法,该类必须被限定为抽象的。
abstract class 类名 {
...
}
抽象类在使用的过程中不能被实例化,但是可以创建一个对象使其指向具体子类的一个实例。
抽象类的子类为父类中的所有抽象方法提供具体的实现,否则它们也是抽象类。
我们也可能会创建一个没有任何抽象方法的抽象类。考虑这种情况:如果有一个类,让其包含任何abstract方法都显得没有实际意义,而且我们也想阻止产生这个类的额任何对象,那么这是这样做就很用了。
接口:是指一个方法的集合,接口中的所有方法都没有方法体。在java中,接口是通过关键字interface来实现的。
interface 接口名 {
...
}
接口可以被看做抽象类的变体。
接口中的所有方法都是抽象的,可以通过接口来间接地实现多重继承。
接口中的成员变量都是static final类型。
接口与抽象类的相同点:
都不能被初始化。
接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能被实例化。
接口与抽象类的不同点:
接口只有定义,其方法不能在接口中实现,只有实现借口的类才能实现接口中定义的方法;而抽象类可以有定义与实现,即其方法可以在抽象类中被实现。
接口需要实现(用implements),但抽象类只能被继承(用extends)。一个类可以实现多个接口,但一个类只能继承一个抽象类,因此使用接口可以间接地达到多重继承的目的。
接口强调特定功能的实现,其设计理念是“has - a”关系;而抽象类强调所属关系,其设计理念为“is- a”关系。
接口中定义的成员变量默认为 public static final,只能够有静态的不能被修改的数据成员,而且,必须给其赋初值;而抽象类可以有自己的数据成员,也可以被定义为 private、 protected、public,这些成员变量可以在子类中被重新定义,也可以被重新赋值。
接口中的所有成员方法都是 public、abstract 的,而且只能被这两个关键字修饰;而抽象类中的抽象方法不能用 private、static、synchronized、native等访问修饰符修饰,同时方法必须以分号结尾,并且不带花括号。
接口被运用于实现比较常用的功能,便于日后维护或添加删除方法;而抽象类更倾向于充当公共类的角色,不适用于日后重新对里面的代码进行修改。
简单来说,接口是一种特殊形式的抽象类,使用接口完全有可能实现与抽象类相同的操作。但一般而言,抽象类多用于在同类事物中有无法具体描述的方法的场景,所以当子类和父类之间存在有逻辑上的层级结构时,推荐使用抽象类;而接口多用于不同类之间,定义不同类之间的通信规则,所以当希望支持差别较大的两个或更多对象之间的特定交互行为时,应该使用接口。
此外,接口可以继承接口,抽象类可以实现接口,抽象类也可以继承具体类,抽象类也可以有静态的main方法。