A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 侯凯斌 中级黑马   /  2012-11-16 16:37  /  1686 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文


运行结果是“TEST”;
但是我觉得a强制转换成了父类,应该调用父类的成员方法,应该是“Base”才对,怎么变成这个了?
求指教,是不是我的继承概念理解不对。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 鼓励一下 。

查看全部评分

3 个回复

倒序浏览
J_Base a = new Test();这是多态,多态中成员函数特点:;编译时期,参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,没有则编译失败。简单总结就是编译看左,运行看右
---------------------------------------------------------------------------------------------------------------------------------------------
成员变量的 特点:无论编译和运行,都参考左边(引用型变量所属的类),静态成员函数的特点:无论编译和运行,都参考左边。
编译时期吧 就看它 你调用的方法在不在那个类中;而在运行时期,其实是虚拟机的“动态绑定”在起作用,即在多态的情况下,虚拟机可以找到所运行对象的真正类型。注意:动态绑定针对的只是对象的方法。属性还是父类的。
在处理Java类中的成员变量时,并不是采用运行时绑定,而是一般意义上的静态绑定。所以在向上转型的情况下,对象的方法可以“找到”子类,而对象的属性 还是父类的属性。
而静态成员函数也是静态绑定的。

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
(1)(J_Base)a:意思是,你把Object类型的强制转化成了J_Base后变成了如下:
J_Base a=new TEST();这是多态的体现了,要想明白为什么运行结果是Test,你需要了解多态的特点了,我知道论坛里面
已经回答过好多次关于多态的特点了,这次在回答一次,希望给你有所帮助:
J_Base a=new TEST();我们假设“=”左边的(引用对象所属的类)叫做“左边”,“=”右边(参与对象所属的类)叫做“右边”多态的特点如下:
(1)在多态中成员函数(非静态)的特点
        在编译时期参阅“左边”,就是看引用变量所属的类中是否有调用的方法,如果有,编译通过,如果没有编译失败
         在运行时期:参与对象所属的类中是否有调用方法
        总结一下:编译看左边,运行看右边
(2)在多态中成员变量的特点
      无论编译和运行,都参考左边(引用变量所属的类)
(3)在多态中,静态成员函数的特点
       无论编译和运行,都参考左边(引用变量所属的类)
所以你调用的方法是成员方法
  Object a=new TEST()
((J_Base)a).mb_method()==>J_Base a=new TEST(); a.mb_method();通过以上的特点就知道是执行子类的中方法
运行结果为Test

评分

参与人数 1技术分 +1 收起 理由
奋斗的青春 + 1 赞一个!

查看全部评分

回复 使用道具 举报
非常感谢,各位指点
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马