(1) abstract(抽象)类和接口都可以有abstract(抽象)方法。
(2) 接口中只可以有常量,不能有变量,而abstract类中既可以有常量也可以有变量。
(3) abstract类中也可以有非abstract方法,接口不可以。
在设计程序时应当根据具体的分析来确定是使用抽象类还是接口。abstract类除了提供重要的需要子类重写的abstract方法以外,还提供了子类可以继承的变量和非abstract方法。
如果某个问题需要使用继承才能更好地解决,比如:子类除了需要重写父类的abstract方法以外,还需要从父类继承一些变量或继承一些重要的非abstract方法,就可以考虑用abstract类。如果某个问题不需要继承,只是需要若干个类给出某些重要的abstract方法的实现细节,就可以考虑使用接口。
注意:JDK1.8接口支持静态方法和默认方法。
1)接口不能用于实例化对象。
2)接口没有构造方法。
3)接口中所有的方法必须是抽象方法。
4)接口不能包含成员变量,除了static和final变量。
5)接口不是被类继承,而是要被类实现。
6)接口支持多继承。
默认方法就是接口可以有实现方法且不需要实现类去实现其方法,只需要在方法名前面加上default关键字即可实现默认方法。默认方法提供了一种扩展接口的方法,而且还不会破坏现有代码。
(1) 接口默认方法、静态方法可以有多个。
(2) 默认方法通过实例调用,静态方法通过接口名调用。
(3) default关键字只能用在接口中。
(4) 默认方法可以被继承,如果继承多个接口,多个接口都定义多个同样的默认方法,实现类需要重写默认方法,不然会报错。
(5) 静态方法不能被继承和覆盖,所以只能被具体所在的接口调用。
注意:JDK1.9以后,允许将方法定义为private,使得某些复用的代码不会把方法暴露出去。