欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 幼教 > 接口多继承与子类继承多接口时的冲突问题,方法冲突与变量冲突.....

接口多继承与子类继承多接口时的冲突问题,方法冲突与变量冲突.....

2024/10/25 13:27:55 来源:https://blog.csdn.net/2301_78542842/article/details/142876233  浏览:    关键词:接口多继承与子类继承多接口时的冲突问题,方法冲突与变量冲突.....

 🚀 个人简介:某大型国企资深软件开发工程师,信息系统项目管理师、CSDN优质创作者、阿里云专家博主,华为云云享专家,分享前端后端相关技术与工作常见问题~

💟 作    者:码喽的自我修养🥰
📝 专    栏:Java入门到实战 🎉

🌈 创作不易,如果能帮助到带大家,欢迎 收藏+关注  💕

​ 🌈🌈文章目录  

1. 默认方法冲突问题

(1)类优先原则

(2)接口冲突(左右为难)

2. 常量冲突问题

3. 小练习

1. 默认方法冲突问题

(1)类优先原则

当一个类,既继承一个父类,又实现若干个接口时,父类中的成员方法与接口中的抽象方法重名,子类就近选择执行父类的成员方法。代码如下:

定义接口:

public interface Friend {default void date(){//约会System.out.println("吃喝玩乐");}
}

定义父类:

public class Father {public void date(){//约会System.out.println("爸爸约吃饭");}
}

定义子类:

public class Son extends Father implements Friend {@Overridepublic void date() {//(1)不重写默认保留父类的//(2)调用父类被重写的
//        super.date();//(3)保留父接口的
//        Friend.super.date();//(4)完全重写System.out.println("码喽讲Java");}
}

定义测试类:

public class TestSon {public static void main(String[] args) {Son s = new Son();s.date();}
}

(2)接口冲突(左右为难)

  • 当一个类同时实现了多个父接口,而多个父接口中包含方法签名相同的默认方法时,怎么办呢?

无论你多难抉择,最终都是要做出选择的。

声明接口:

public interface BoyFriend {default void date(){//约会System.out.println("神秘约会");}
}

选择保留其中一个,通过“接口名.super.方法名"的方法选择保留哪个接口的默认方法。

public class Girl implements Friend,BoyFriend{@Overridepublic void date() {//(1)保留其中一个父接口的
//        Friend.super.date();
//        BoyFriend.super.date();//(2)完全重写System.out.println("吗喽讲Java");}}

测试类

public class TestGirl {public static void main(String[] args) {Girl girl = new Girl();girl.date();}
}
  • 当一个子接口同时继承了多个接口,而多个父接口中包含方法签名相同的默认方法时,怎么办呢?

另一个父接口:

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可以高速地进行读写操作");}
}

子接口:

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. 常量冲突问题

  • 当子类继承父类又实现父接口,而父类中存在与父接口常量同名的成员变量,并且该成员变量名在子类中仍然可见。

  • 当子类同时实现多个接口,而多个接口存在相同同名常量。

此时在子类中想要引用父类或父接口的同名的常量或成员变量时,就会有冲突问题。

父类和父接口:

public class SuperClass {int x = 1;
}
public interface SuperInterface {int x = 2;int y = 2;
}
public interface MotherInterface {int x = 3;
}

子类:

public class SubClass extends SuperClass implements SuperInterface,MotherInterface {public void method(){
//        System.out.println("x = " + x);//模糊不清System.out.println("super.x = " + super.x);//1System.out.println("SuperInterface.x = " + SuperInterface.x);//2System.out.println("MotherInterface.x = " + MotherInterface.x);//3System.out.println("y = " + y);//没有重名问题,可以直接访问 //2}
}

3. 小练习

排错题

interface A {int x = 0;
}
class B {int x = 1;
}
class C extends B implements A {public void pX() {System.out.println(x);}public static void main(String[] args) {new C().pX();}
}

到此这篇文章就介绍到这了,更多精彩内容请关注本人以前的文章或继续浏览下面的文章,创作不易,如果能帮助到大家,希望大家点点收藏+关注 ~💕  

​ 

   更多专栏订阅推荐:

🥕 JavaScript深入研究

👍 前端工程搭建
💕 vue从基础到起飞

✈️ HTML5与CSS3

🖼️ JavaScript基础

⭐️ uniapp与微信小程序

📝 前端工作常见问题与避坑指南

✍️ GIS地图与大数据可视化

📚 常用组件库与实用工具

💡 java入门到实战 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com