在百度知道里看到的提问,挺有意思的给大家分享一下,大家顺便帮我看看对不对。
他建立的是同一个子类对象,但是由于多态的原因,可以将类型转换成子类或父类。当引用不同的时候,会发现打印的结果完全不同。
我是这样理解的,也是这么给他的回答的,大家帮我看看对不对:
在堆内存中,你建立的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.jpg
(10.9 KB, 下载次数: 23)
-
3.jpg
(68.97 KB, 下载次数: 9)
-
4.jpg
(1.35 KB, 下载次数: 20)
-
5.jpg
(70.53 KB, 下载次数: 14)
-
6.jpg
(1.33 KB, 下载次数: 16)
 组图打开中,请稍候......
|