2019.7.30更新:以前的整理可能难于理解,现在再整一次(针对jdk1.8及以上)。
接口:
不是一个类(也没有继承Object),不能实例化,但是可以声明一个未初始化变量。不能有私有的成员变量或者方法。(参照菜鸟教程)
· 变量默认是public static final 修饰,方法默认是public abstract;
· default修饰的方法必须有方法体,并且该接口的实现类非必须实现defualt方法。static方法必须有方法体
· 如果该接口(A)的实现类(AA)没有实现A中所有的public方法,那么AA一定为abstract抽象类。之后在AA的子类或者实现类中,需要继续重写AA 没有实现的方法。
抽象类:
除了不能实例化,其余跟普通的类没有区别。不同于接口,正常类可以实例多个接口,但只能继承一个类。
· 抽象类中的抽象方法一定是public abstract
· 抽象类中不一定有抽象方法
以前的:
1.本质上来讲,接口也是一种类,是一种特殊的抽象类,但是这个抽象类只包含常量和方法的定义,没有方法的实现和变量。
2.接口里面封装了很多方法,当一个类要实现一个接口,重写情况有两种:一.子类是抽象类,有选择地重写接口里面的方法;二.子类是非抽象类,必须全部重写。
3.一个类可以继承多个接口,但是只能继承一个抽象类。类和接口没有必然联系。
4.抽象类能够定义非 static final 的属性(field),而接口不能。接口的属性都是static final的。抽象类能够定义非public方法,而接口不能。接口的方法默认都是public的,因此继承接口的类的方法权限不能比public小(即只能是public)
接口中的方法默认为public abstract,属性默认为public static final。接口中的方法不能有实现,Java中类只支持单继承,而接口可以支持多继承。