做网站的要求,网站常州建设,苏州高级网站建设,广州安全教育网登录平台JAVA8接口使用问题 文章目录 JAVA8接口使用问题1、默认方法冲突问题#xff08;1#xff09;亲爹优先原则#xff08;2#xff09;左右为难 2、常量冲突问题 1、默认方法冲突问题
#xff08;1#xff09;亲爹优先原则
当一个类#xff0c;既继承一个父类#xff0c;…JAVA8接口使用问题 文章目录 JAVA8接口使用问题1、默认方法冲突问题1亲爹优先原则2左右为难 2、常量冲突问题 1、默认方法冲突问题
1亲爹优先原则
当一个类既继承一个父类又实现若干个接口时父类中的成员方法与接口中的抽象方法重名子类就近选择执行父类的成员方法。代码如下
定义接口
package _01默认方法冲突问题.__01亲爹优先原则;public interface Friend {default void date(){//约会System.out.println(和朋友吃喝玩乐);}
}
定义父类
package _01默认方法冲突问题.__01亲爹优先原则;public class Father {public void date(){//约会System.out.println(爸爸约吃饭);}
}
定义子类
package _01默认方法冲突问题.__01亲爹优先原则;public class Son extends Father implements Friend{Overridepublic void date() {//(1)不重写默认保留父类的//(2)调用父类被重写的
// super.date();//(3)保留父接口的
// Friend.super.date();//(4)完全重写System.out.println(学Java);}
}
定义测试类
package _01默认方法冲突问题.__01亲爹优先原则;public class TestSon {public static void main(String[] args) {Son s new Son();s.date();}
}2左右为难
当一个类同时实现了多个父接口而多个父接口中包含方法签名相同的默认方法时怎么办呢 无论你多难抉择最终都是要做出选择的。
声明接口
package _01默认方法冲突问题.__02左右为难.___01一个类实现多个接口;public interface BoyFriend {default void date(){//约会System.out.println(和男朋友神秘约会);}
}
package _01默认方法冲突问题.__02左右为难.___01一个类实现多个接口;public interface Friend {default void date(){//约会System.out.println(和朋友吃喝玩乐);}
}
选择保留其中一个通过“接口名.super.方法名的方法选择保留哪个接口的默认方法。
package _01默认方法冲突问题.__02左右为难.___01一个类实现多个接口;public class Girl implements Friend,BoyFriend{Overridepublic void date() {//(1)保留其中一个父接口的
// Friend.super.date();
// BoyFriend.super.date();//(2)完全重写System.out.println(学Java);}
}
测试类
package _01默认方法冲突问题.__02左右为难.___01一个类实现多个接口;public class TestGirl {public static void main(String[] args) {Girl girl new Girl();girl.date();}
}
当一个子接口同时继承了多个接口而多个父接口中包含方法签名相同的默认方法时怎么办呢 另一个父接口
package _01默认方法冲突问题.__02左右为难.___02一个子接口继承多个接口;public interface Usb2 {//静态常量long MAX_SPEED 60*1024*1024;//60MB/s//抽象方法void in();void out();//默认方法public default void start(){System.out.println(开始);}public default void stop(){System.out.println(结束);}//静态方法public static void show(){System.out.println(USB 2.0可以高速地进行读写操作);}
}
package _01默认方法冲突问题.__02左右为难.___02一个子接口继承多个接口;public interface Usb3 {//静态常量long MAX_SPEED 120*1024*1024;//120MB/s//抽象方法void in();void out();//默认方法public default void start(){System.out.println(开始);}public default void stop(){System.out.println(结束);}//静态方法public static void show(){System.out.println(USB 3.0可以高速地进行读写操作);}
}
子接口
package _01默认方法冲突问题.__02左右为难.___02一个子接口继承多个接口;public interface Usb extends Usb2,Usb3{Overridedefault void start() {System.out.println(Usb.start);}Overridedefault void stop() {System.out.println(Usb.stop);}
}小贴士
子接口重写默认方法时default关键字需要保留。
子类重写默认方法时default关键字不可以保留。
2、常量冲突问题
当子类继承父类又实现父接口而父类中存在与父接口常量同名的成员变量并且该成员变量名在子类中仍然可见。当子类同时继承多个父接口而多个父接口存在相同同名常量。
此时在子类中想要引用父类或父接口的同名的常量或成员变量时就会有冲突问题。
父类和父接口
package _02常量冲突问题;public class SuperClass {int x 1;
}
package _02常量冲突问题;public interface SuperInterface {int x 2;int y2;
}
package _02常量冲突问题;public interface MotherInterface {int x 3;
}
子类
package _02常量冲突问题;import org.junit.Test;public class SubClass extends SuperClass implements SuperInterface,MotherInterface{Testpublic void method(){//System.out.println(xx);//模糊不清System.out.println(super.x super.x);System.out.println(SuperInterface.x SuperInterface.x);System.out.println(MotherInterface.x MotherInterface.x);System.out.println(y y);//没有重名问题可以直接访问}
}