gpt4 book ai didi

Java 继承问题 - 尝试理解这个概念

转载 作者:行者123 更新时间:2023-12-03 20:22:43 24 4
gpt4 key购买 nike

我试图理解继承概念,但我有一个小问题。

我有两个 A 类和 B 类:

public class B extends A
{
public B()
{
System.out.println ("B");
}

public void arik ()
{
System.out.println("Arik_B");
}
public void yosef ()
{
System.out.println ("Yosef");
}

public void superYosef()
{
super.yosef();
}
}

public class A
{
public A()
{
System.out.println ("A");
}

public void arik ()
{
System.out.println ("Arik_A");
}

public void yosef ()
{
arik();
}
}

主要内容:

A ab = new B();
((B) ab).superYosef();

A ab = new B(); 行将打印 A B,这很清楚。但是行 ((B) ab).superYosef(); 打印 Arik_B 我不明白为什么。在运行 ab 之前输入 A 并且在运行时输入 B 所以它需要打印 Yosef

最佳答案

当你做的时候

A ab = new B();

然后是 A 类型的变量 ab,但它引用的实际对象是 B 类型。对象的实际类型决定将调用哪个方法,而不是变量的类型。

因此,当您在 ab 上调用任何已在类 B 中重写的方法时,将调用来自类 B 的版本。

让我们看看这里发生了什么:

((B) ab).superYosef();

你需要转换,因为方法superYosef只在类B中定义。

该方法调用 super.yosef();,它将调用类 A 中的 yosef 方法。 A.yosef调用arik,这个方法在类B中被覆盖。请注意,我们在一个实际上是 B 的对象上调用了该方法,因此调用了 B 中的 arik 方法,它打印出 Arik_B.

关于Java 继承问题 - 尝试理解这个概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21456050/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com