在Java中,为什么((A)b).disp()调用派生类方法disp()而不是基类方法disp()?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了在Java中,为什么((A)b).disp()调用派生类方法disp()而不是基类方法disp()?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1325字,纯文字阅读大概需要2分钟。
内容图文
![在Java中,为什么((A)b).disp()调用派生类方法disp()而不是基类方法disp()?](/upload/InfoBanner/zyjiaocheng/681/5f1077e2d5ba463c945d3faeb6369ad8.jpg)
我正在学习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具有一个整数属性名称值,而A.alter()是一种更改该值的方法.想象一下,B扩展了A并覆盖了该方法,B进一步保证了属性值始终为正. A.alter()有时可能会导致该值为负,但B.alter()永远不会.
如果((A)b).alter()在类型B的对象上调用了A.alter()方法,则结果可能是具有负值的B:本应具有的保证将被破坏.
内容总结
以上是互联网集市为您收集整理的在Java中,为什么((A)b).disp()调用派生类方法disp()而不是基类方法disp()?全部内容,希望文章能够帮你解决在Java中,为什么((A)b).disp()调用派生类方法disp()而不是基类方法disp()?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。