super.getClass()方法调用返回结果的原因
http://bbs.csdn.net/topics/370010127
看到Java筆試題中有一道關于super的題,題目如下:
下面程序的輸出結果是多少?
import?java.util.Date;
public??class?Test?extends?Date{
public?static?void?main(String[]?args)?{
new?Test().test();
}
public?void?test(){
System.out.println(super.getClass().getName());
}
}
很奇怪,結果是Test
這屬于腦筋急轉彎的題目,在一個qq群有個網友正好問過這個問題,我覺得挺有趣,就研究了一下,沒想到今天還被你面到了,哈哈。
在test方法中,直接調用getClass().getName()方法,返回的是Test類名
由于getClass()在Object類中定義成了final,子類不能覆蓋該方法,所以,在
test方法中調用getClass().getName()方法,其實就是在調用從父類繼承的getClass()方法,等效于調用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也應該是Test。
如果想得到父類的名稱,應該用如下代碼:
getClass().getSuperClass().getName();
————————————————————
以上是題目和分析,我也做了測試,結果確實是Test,但是我看不明白下面的分析,我覺得他說的模棱兩可,沒有說明白實質問題。
為此,我查閱了Object的getClass()方法的API,解釋是:返回此?Object?的運行時類。返回的?Class?對象是由所表示類的?static?synchronized?方法鎖定的對象。
看了這個,我很清楚this.getClass()是返回運行時對象的類型,但是super.getClass()為何返回的還是子類的類型,還是不明白。
后來在網上查了super的含義,有一個帖子說super不是超類的引用,而是表示在子類中調用父類的方法或屬性而已,并且給出例子
class?B?extends?A{
???????public?void?print(){
??????????????System.out.println(super.getClass());//調用A類中的getclass()方法,A是Object的子類,A中的getClass()是Object中的,運行時期的實例是B類,所以輸出的依然是Class?B
??????????????System.out.println(this.getClass());?//調用B類中的getclass()方法,此方法從A繼承的,A從Object繼承的,運行時期的實例是B類,所以輸出的是Class?B
??????????????/*上面的super.getClass()和this.getClass()都是調用的Object中的getClass(),而super.getClass()和this.getClass()都是通過實例化B類,調用print(),從而調用這兩個方法,運行時期的類都是B,Object中的getClass()返回的是運行時期的類?名,所以輸出都是Class?B
??????????????*/
}
總結
以上是生活随笔為你收集整理的super.getClass()方法调用返回结果的原因的全部內容,希望文章能夠幫你解決所遇到的問題。

- 上一篇: 在Java内部类中使用外部类的成员方法以
- 下一篇: JNI字段描述符[Ljava/lang/