网站首页 > 精选教程 正文
让我们了解所有关于继承的知识
嗨,大家好! 今天我们可以讨论我们在 Java 中的 OOP 中的一个概念。 其实这也是我面试的时候问的。 所以,我决定写我已经知道的东西。 但是除了解释继承之外,还有更多的事实!! 更多的焦点将放在钻石问题上,以及解决它的替代方法是什么……
什么是继承?
继承是两个类之间的关系/关联,其中一个类继承另一个类的属性。 这种关系是使用 Java 中的 extends 关键字定义的,如下所示。
public class X extends Y {}
这是 IS-A 关系。 让我们举个例子。 我们可以将 Vehicle 和 Car 定义为两个相关的类,其中 Vehicle 是父类,Car 是子类。 在这里,汽车就是汽车!!! 不是吗?
我不会深入解释继承。 但是我们可以简要讨论一下我们拥有的继承类型。
- 单一继承 - 仅将一个类扩展 1 个类
public class X {}public class X extends Y {}
- 多级继承——从派生类扩展类,后跟关联顺序
public class X {}public class Y extends X {}
public class Z extends Y {}
- Hierarchical Inheritance — 扩展具有相同父类的类集
public class X {}public class Y extends X {}public class Z extends X {}
多重继承
这是文章的重点!!! 这里 1 个类扩展了 1 个以上的类。
public class X {}public class Y {}public class Z extends X, Y {}
坚持,稍等! Java支持吗?不! Java中不允许多重继承!在任何给定的时间点,给定的 Java 类只能从一个超类扩展。
为什么?让我们来看看…
钻石问题
它发生在这种情况下。假设我们有一个名为 A 的抽象父类。然后我们有扩展 A 的 X 和 Y 类。对吗?然后我们有另一个类 Z 扩展了 X 和 Y(棘手的部分)!所有的类都有一个名为 methodX 的方法,它继承自 A。X 和 Y 都重写了方法实现以提供自己的逻辑。
那么,如何在 Z 类中覆盖 methodX ???
我们不可以。它造成了歧义,因为我们有 2 个具有相同方法的父类。那么,要覆盖哪一个? Java 编译器本身就很混乱!这就是Java不支持多重继承的原因。在那里,我们遇到了钻石问题!
那么,为什么它被称为钻石问题呢?
让我给你看一个UML图。看看班级安排……那你就明白了!
你答对了? 菱形类设置是这个名字的原因!
替代解决方案
我们有类似的带有接口的替代实现。 我们可以实现一个具有任意数量接口的类。 Java 已经支持它。
但是如果两个接口也有相同的方法会发生什么呢?
看下面的例子……这包括 Java 8 默认方法
我们有 2 个具有相同默认方法的接口。 那么 Z 是继承的派生类 现在它在 methodX() 方法中遇到了歧义。
interface X {
default void methodX() {
System.out.println("X:::methodX");
}
}interface Y {
default void methodX() {
System.out.println("Y:::methodX");
}
} public class Z implements X, Y {
public void methodX() {
// what to do here???
}
public static void main(String args[]) {
Z z = new Z();
z.methodX();
}
}
有两种方法可以处理这个问题。
- 用自己的逻辑覆盖类方法
- 用继承的接口实现之一覆盖类方法
覆盖:提供自己的逻辑
public class Z implements X, Y {
public void methodX() {
System.out.println("ZClass:::methodX");
}
public static void main(String args[]) {
Z obj = new Z();
obj.methodX();
}
}
Override:提供继承的类实现
public class Z implements X, Y {
public void methodX() {
X.super.methodX();
// OR
Y.super.methodX();
}
public static void main(String args[]) {
Z obj = new Z();
obj.methodX();
}
}
通过这种方式,我们可以根据我们的要求消除常用方法中的歧义——方法 1 或 2……
这都是关于继承 Java 中的菱形问题。 我们也讨论了解决这种情况的另一种方法……所以,现在是时候结束了!!! 在这里阅读并分享您的想法..
关注七爪网,获取更多APP/小程序/网站源码资源!
猜你喜欢
- 2024-11-27 JAVA面向对象的三大特征——继承
- 2024-11-27 JAVA中的注解可以继承吗?
- 2024-11-27 学长带你学习java第三课——继承
- 2024-11-27 java技术专家带你深入java核心技术:反射+继承设计技巧+枚举类
- 2024-11-27 【编程】Java中的继承和多态,你了解多少?
- 2024-11-27 Java开发:java面向对象思想之继承
- 2024-11-27 用最通俗易懂的例子讲明白继承和组合的本质区别
- 2024-11-27 java继承的概念是什么?
- 2024-11-27 java基础-3-继承
- 2024-11-27 Java小白成长记:Java如何实现封装、继承、解析解构
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)