转载注明:https://blog.youkuaiyun.com/starbxx/article/details/95316647
在Java中,可以通过两种形式来体现OOP的抽象:接口和抽象类。
1.抽象类:
[public] abstract class ClassName {
abstract void fun();
}
(1)抽象方法:抽象类定义为“包含抽象方法的类”,即包含抽象方法的类一定是抽象类,但是抽象类不一定包含抽象方法(咬文嚼字)。抽象方法和抽象类前面加abstract修饰符。
(2)成员变量:抽象类同样可以拥有成员变量。
(3)普通的成员方法:抽象类同样可以拥有普通的成员方法,并且实现。
2.接口:
[public] interface InterfaceName {
}
(1)抽象方法:接口包含抽象方法。
(2)成员变量:接口中的变量会被隐式地指定为public static final变量(并且只能是public static final变量,用private修饰会报编译错误)。
(3)普通的成员方法:JDK8之前,接口中的方法必须都是抽象方法,JDK8 之后,接口也可以拥有默认的方法实现,这是因为不支持默认方法的接口的维护成本太高,如果想给一个接口添加一个新的方法,那么需要修改所有实现了该接口的类。
3.抽象类和普通类的区别
(1)抽象方法必须为public或者protected(因为如果为private,则不能被子类继承,子类便无法实现该方法),缺省情况下默认为public。
(2)抽象类不能用来创建对象,不能实例化;
(3)如果一个类继承于一个抽象类,则子类必须实现父类的所有抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为为abstract类。
4.接口和抽象类的区别
接口(interface)和抽象类(abstract class)是支持抽象类定义的两种机制。
相同点:
(1)都不能被实例化。
(2)接口的实现类或抽象类的子类都只有实现了接口或抽象类中的方法后才能实例化。
不同点:
(1)接口只有定义,不能有方法的实现,而抽象类可以有定义与实现,方法可在抽象类中实现(JDK8之前)。接口和抽象类都可以有方法的定义(JDK8之后)。
(2)实现接口的关键字为implements,继承抽象类的关键字为extends。一个类可以实现多个接口,但一个类只能继承一个抽象类。所以,使用接口可以间接地实现多重继承。
(3)接口成员变量默认为public static final,必须赋初值,不能被修改;其所有的成员方法都是public、abstract的。抽象类中成员变量默认default,可在子类中被重新定义,也可被重新赋值;抽象方法被abstract修饰,不能被private、static、synchronized和native等修饰,必须以分号结尾,不带花括号。
(4)接口强调特定功能的实现,而抽象类强调所属关系。
(5)接口被用于常用的功能,便于日后维护和添加删除,而抽象类更倾向于充当公共类的角色,不适用于日后重新对立面的代码修改。功能需要累积时用抽象类,不需要累积时用接口。