/*
- JDK8中关于接口的新特性
- JDK8以后的版本中接口内的结构除了可以定义全局常量和抽象方法外,还可以定义静态方法与默认方法
- 静态方法:使用 static 关键字修饰。可以通过接口直接调用静态方法,并执行其方法体。经常在相互一起使用的类中使用静态方法。
- 可以在标准库中找到像Collection/Collections或者Path/Paths这样成对的接口和类。
- 默认方法:默认方法使用 default 关键字修饰。可以通过实现类对象来调用。我们在已有的接口中提供新方法的同时,还保持了与旧版本代码的兼容性。
- 比如:java 8 API中对Collection、List、Comparator等接口提供了丰富的默认方法
- 1,接口中定义的静态方法只能被接口调用。(类似工具类)
- 2,通过实现类对象可以调用接口中的默认方法。实现类中可以重写接口里面的默认方法。
- 这样对象调用时,调用的是重写的方法。
- 3,若一个接口中定义了一个默认方法,而父类中也定义了一个同名同参数的非抽象方法,则不会出现冲突问题。因为此时遵守:类优先原则。
- 接口中具有相同名称和参数的默认方法会被忽略。在子类没有重写此默认方法 的情况下优先调用父类的此方法。
- 优先顺序为子类重写方法–父类方法–接口方法
- 4,若一个接口中定义了一个默认方法,而另外一个接口中也定义了一个同名同参数的方法(不管此方法是否是默认方法),
- 在实现类同时实现了这两个接口时,会出现:接口冲突。解决办法:实现类必须覆盖接口中同名同参数的方法,来解决冲突。
- 5,子类中调用父类中的重写方法使用super().方法名的方式,指定调用接口中重写的默认方法使用接口名.super.方法名();的方式。
*/
package object_chapter2;
public class Object_Interface_JDK8 {
public static void main(String[] args) {
HighLevelTest t = new HighLevelTest();
// t.method1();//接口中定义的静态方法不会被实现类继承,无法通过实现类的对象调用
HighLevel.method1();//接口中的静态方法只能被接口直接调用
t.method2();
HighLevelTest1 t1 = new HighLevelTest1();
t1.method2();
HighLevelTest2 t2 = new HighLevelTest2();
t2.method2();
System.out.println("----------------");
t2.method3();
}
}
interface HighLevel{
//静态方法
static void method1() {
System.out.println("平安无事");
}
//默认方法
default void method2() {
System.out.println("小心火烛");
}
}
interface HighLevel2{
default void method2() {
System.out.println("天下太平");
}
}
class SuperClass{
public void method2() {//此处必须加public否则会报错 The inherited method SuperClass.method2() cannot hide the public abstract method in HighLevel2
// 父类同名同参方法的权限不能小于接口中的方法。
System.out.println("阖家团圆");
}
}
class HighLevelTest implements HighLevel{//接口中没有抽象方法可以不用重写
}
class HighLevelTest1 implements HighLevel,HighLevel2{
@Override
public void method2() {
// TODO Auto-generated method stub
// HighLevel.super.method2();//指明此method2()方法调用的是HighLevel接口中的同名方法,解决冲突问题
// HighLevel2.super.method2();//指明此method2()方法调用的是HighLevel2接口中的同名方法
System.out.println("河清海晏");//或者重写method2()方法来解决问题
}//接口中没有抽象方法可以不用重写
}
class HighLevelTest2 extends SuperClass implements HighLevel,HighLevel2{
void method3() {
super.method2();//调用父类中的同名方法
HighLevel.super.method2();//调用接口HighLevel中的同名方法
HighLevel2.super.method2();//调用接口HighLevel2中的同名方法
}
}