我正在学习 Java,是一个初学者...请帮我找出为什么这不起作用...
在下面的程序中,我的目标是从主方法调用基类方法,而不在派生类方法中使用 super 关键字。
如代码所示,main方法中的 ((A)b).num 工作得很好,并且按预期输出 100,但是 ((A)b).disp() 输出 B 方法中的内容,而不是 A 方法中的内容。
class A
{
int num=100;
public void disp()
{
System.out.println("Disp() of A:");
System.out.println(num);
}
}
class B extends A
{
int num=200;
public void disp()
{
System.out.println("Disp() of B:");
super.disp(); //100
System.out.println( num ); //200
}
}
class ques
{
public static void main(String a[])
{
B b=new B();
b.disp();
System.out.println();
((A)b).disp(); //doesn't work
System.out.println();
System.out.println(((A)b).num); //works
}
}
输出是:
Disp() of B:
Disp() of A:
100
200
Disp() of B:
Disp() of A:
100
200
100
但我的预期输出是:
Disp() of B:
Disp() of A:
100
200
Disp() of A:
100
100
谁能帮我找出这个输出的原因。
为什么 ((A)b).num 工作正常而 ((A)b).disp() 没有按预期工作......
而且这不会给出编译错误......!提前致谢.. :)
必须这样才能保留派生类的语义。
假设 A 有一个整数属性名称value,而 A.alter() 是更改该值的方法。假设 B 扩展了 A 并重写了该方法,并且 B 提供了属性的额外保证value总是积极的。 A.alter() 有时可能会导致该值为负数,但 B.alter() 永远不会。
如果 ((A)b).alter() 对 B 类型的对象调用 A.alter() 方法,则结果可能是具有负值的 B:B 应该具有的保证将被破坏。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)