我试图理解继承的概念,我有一个小问题。
我有两个班级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();
那么变量
ab
的类型为A
,但是它引用的实际对象的类型为B
。对象的实际类型决定了将调用哪个方法,而不是变量的类型。因此,当您在
ab
上调用在类B
中已被覆盖的任何方法时,将调用类B
中的版本。让我们看看这里发生了什么:
((B) ab).superYosef();
您需要强制转换,因为方法
superYosef
仅在类B
中定义。该方法调用
super.yosef();
,它将在类yosef
中调用A
方法。 A.yosef
调用arik
,并且此方法在类B
中被覆盖。请注意,我们已经在实际上是B
的对象上调用了该方法,因此将调用arik
中的B
方法,该方法将显示Arik_B
。