我试图理解继承的概念,我有一个小问题。
我有两个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();
打印AB,这很清楚。但是行((B) ab).superYosef();
打印Arik_B
,我不明白为什么。在运行之前ab
是type A
,在运行时是B,因此需要打印Yosef
当你做
A ab = new B();
那么ab
类型的变量A
,但是它指向的实际对象是类型的B
。对象的实际类型决定了将调用哪个方法,而不是变量的类型。
因此,当您调用任何ab
已在class中被覆盖的方法时,都会调用classB
中的版本B
。
让我们看看这里发生了什么:
((B) ab).superYosef();
您需要进行强制转换,因为该方法superYosef
仅在class中定义B
。
该方法调用super.yosef();
,它将yosef
在类中调用该方法A
。的A.yosef
通话arik
,而且这种方法在课堂上被覆盖B
。请注意,我们已经在实际上是a的对象上调用了方法B
,因此调用了arik
方法B
print Arik_B
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句