日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

super.getClass()方法调用返回结果的原因

發布時間:2024/4/17 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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()方法调用返回结果的原因的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。