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

在百度知道里看到的提问,挺有意思的给大家分享一下,大家顺便帮我看看对不对。
他建立的是同一个子类对象,但是由于多态的原因,可以将类型转换成子类或父类。当引用不同的时候,会发现打印的结果完全不同。
我是这样理解的,也是这么给他的回答的,大家帮我看看对不对:
在堆内存中,你建立的Test2对象被new出来以后,实际上里面有两个var_final变量,一个是this.var_final,一个是super.var_final,也有两个方法,一个是this.myFunction(),一个是super.myFunction()。
所以,当你在使用"对象.成员变量"的方法调用的时候,如果你没有在那个变量前面加this或super进行指定,那么虚拟机就会按照对象的类型来决定是调用哪一个。所以在修改以前,你的test的类型是父类,
自然就是调用的的super.var_final和super.myFunction()。修改以后,这个对象被强制转变成了子类,所以就调用了this.var_final和this.myFunction()。
而你的那个doit()方法里面输出的一直是200,是因为你不是用的对象的引用test或testd,而是直接写的var_final,所以JVM直接调用的是this.var_final。

更多图片 小图 大图
组图打开中,请稍候......

1 个回复

倒序浏览
他提问的时候就是截的图,我也懒得再在eclipse里面写一遍了。就直接也也截图下来了。有兴趣的兄弟凑合着看一下吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马