super.getClass()陷阱 – JAVA編程語言程序開發技術文章

先給出一個問題,下面程序的輸出結果是多少?

 

Java代碼 
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());    
    }    
}   

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()); 
    } 
}  

你可能會認為是Date,但是實際的結果是Test。沒錯,你沒有看錯,super.getClass()並不會返回超類的引用。我們再做一個實驗,在test方法中直接調用getClass().getName()方法,則結果返回的是Test。為什麼super沒有起作用呢?簡單來說,super並不能代表一個超類的引用。 

 

因為super並沒有代表超類的一個引用的能力,隻是代表調用父類的方法而已。所以,在子類的方法中,不能這樣用System.out.println(super);也不能使用super.super.mathod();

 

事實上,super.getClass()是表示調用父類的方法。getClass方法來自Object類,它返回對象在運行時的類型。因為在運行時的對象類型是Test,所以this.getClass()和super.getClass()都是返回Test。

 

此外,由於getClass()在Object類中定義成瞭final,子類不能覆蓋該方法,所以,在test方法中調用getClass().getName()方法,其實就是在調用從父類繼承的getClass()方法,等效於調用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也應該是Test。 

 

如果想得到父類的名稱,應該用如下代碼: 

 

Java代碼 
getClass().getSuperClass().getName();  

本文出自“eriol”

發佈留言