接口(interface)与抽象类(abstract class)两者的异同
首先说明一下,JDK1.8以后接口可以有默认方法和静态方法以及私有方法。
一、概念:
接口(interface):是抽象类的变体,其中所有的方法都是抽象的且不能有方法体,而且只能定义 static final 成员变量。例如:public static final int MAX_VALUE = 0x7fffffff;
抽象类(abstract class):声明方法的存在但不去实现它的类叫做抽象类。抽象类中可以有实现了的方法,也可以没有实现了的方法;抽象类中可以没有抽象的方法,但有抽象方法的类一定是抽象类。抽象类与普通类最大的区别是它不能被直接实例化,只能通过子类间接实例化。
二、区别
1.两者的共同点:
(1)两者都是抽象类,都不能被实例化。
(2) interface实现类及abstract class的子类都必须要实现已经声明的抽象方法。
2.两者的不同点:
(1)一个类可以实现(implements)多个interface,但一个类只能继承(extends)一个abstract class。
(2)interface强调特定功能的实现,具有哪些功能,而abstract class强调所属关系。
(3)尽管interface实现类及abstract class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的(declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现(只实现其中的抽象方法,覆盖其中已实现了的方法,二者均实现)。
(4)interface是完全抽象的,只能声明方法,而且只能声明public的方法,不能声明private及protected的方法,不能定义方法体,也不能声明实例变量。
三、为什么Java中采用多接口而没有多继承?
接口只定义了你做什么,而不关心你怎么做;
如果是多继承,有可能两个类定义的两个方法是做同一件事情的,那么他们的子类就无法选择到底去用哪一个了