JDK1.8之前的接口的定义和限制
- 接口不能用于实例化对象。
- 接口没有构造方法。
- 接口中所有的方法必须是抽象方法。
- 接口不能包含成员变量,除了 static 和 final 变量。
- 接口不是被类继承了,而是要被类实现。
- 接口支持多继承。
JDK1.8接口支持静态方法和默认方法
默认方法主要优势:
1、提供了一种扩展接口的方法,而不破坏现有代码。
如果一个已经投入使用的接口需要扩展一个新的方法,在JDK8以前,我们必须再该接口的所有实现类中都添加该方法的实现,否则编译会出错。如果实现类数量很少且我们有修改的权限,可能工作量会少,但是如果实现类很多或者我们没有修改代码的权限,这样的话就很难解决了。而默认方法提供了一个实现,当没有显式提供时就默认采用这个实现,这样新添加的接口就不会破坏现有的代码。
2、默认方法另一个优势是该方法是可选的,子类可以根据不同的需求而且经override或者采用默认实现。
总结:
1、接口默认方法、静态方法可以有多个。
2、默认方法通过实例调用,静态方法通过接口名调用。
3、default默认方法关键字只能用在接口中。
4、默认方法可以被继承,如果继承了多个接口,多个接口都定义了多个同样的默认方法,实现类需要重写默认方法不然会报错。
5、静态方法不能被继承及覆盖,所以只被具体所在的接口调用。
public interface InterfaceJDK8 {
/*接口的普通抽象方法*/
public void common(String str);
/*jdk1.8 默认方法:
允许在已有的接口中添加新方法,而同时又保持了与旧版本代码的兼容性,
默认方法与抽象方法不同之处在于抽象方法必须要求实现,但是默认方法则没有要求实现,
相反,接口提供了一个默认实现,这样所有的接口实现者将会默认继承他
(如果有必要的话,可以覆盖这个默认实现)。
接口的默认方法:得到接口的实现类对象,直接用对象的引用.方法名。默认方法可以被实现类覆盖。
*/
default public void defaultMethod(String str){
System.out.println("InterfaceJDK8:" + str);
}
/*jdk1.8 静态方法:
允许在已有的接口中添加静态方法,接口的静态方法属于接口本身,不被继承,也不需要提供方法的实现。
*/
public static void staticMethod(String str){
System.out.println("InterfaceJDK8:" + str);
}
}
public class InterfaceJDK8Impl implements InterfaceJDK8 {
@Override
public void commonMethod(String str) {
System.out.println("我是通通方法");
}
public static void main(String[] args){
//静态方法 接口.方法 调用 (不被继承,不被实现)
InterfaceJDK8.staticMethod("我是静态方法");
InterfaceJDK8Impl interfaceJDK8Impl = new InterfaceJDK8Impl();
//默认方法 实例.方法名 调用 (被继承,可以重写覆盖默认实现,也可以不重写)
interfaceJDK8Impl.defauleMethod("我是默认方法");
}
}
// InterfaceJDK8 :我是静态方法
// InterfaceJDK8 :我是默认方法
public class InterfaceJDK8Impl implements InterfaceJDK8 {
@Override
public void commonMethod(String str) {
System.out.println("InterfaceJDK8Impl :我是通通方法");
}
@Override
public void defauleMethod(String str) {
System.out.println("InterfaceJDK8Impl :" + str);
}
public static void main(String[] args){
InterfaceJDK8.staticMethod("我是静态方法");
InterfaceJDK8Impl interfaceJDK8Impl = new InterfaceJDK8Impl();
interfaceJDK8Impl.defauleMethod("我是默认方法");
}
}
// InterfaceJDK8 :我是静态方法
// InterfaceJDK8Impl :我是默认方法
接口默认方法的”类优先”原则
若一个接口中定义了一个默认方法,而另外一个父类或接口中 又定义了一个同名的方法时 选择父类中的方法。如果一个父类提供了具体的实现,那么 接口中具有相同名称和参数的默认方法会被忽略。
接口冲突:如果一个父接口提供一个默认方法,而另一个接 口也提供了一个具有相同名称和参数列表的方法(不管方法 是否是默认方法),那么必须覆盖该方法来解决冲突