2014-09-06 106 views
0

執行此代碼時應該打印什麼? 我從here挑選的問題提供了答案,但我有點相信是錯誤的。首先靜態函數調用已在靜態的方式來完成,第二,當我們覆蓋靜態函數前一個不再可訪問(沒有新的內存分配)Java:重寫靜態函數

class Base { 
    public static void show() { 
     System.out.println("Base::show() called"); 
    } 
} 

class Derived extends Base { 
    public static void show() { 
     System.out.println("Derived::show() called"); 
    } 
} 

class Main { 
    public static void main(String[] args) { 
     Base b = new Derived();; 
     b.show(); 
    } 
} 
+5

'靜態'方法永遠不會'覆蓋' – Braj 2014-09-06 20:34:18

+5

「_當我們執行這個代碼時應該打印什麼?_」你不能只是執行它並看到? – csmckelvey 2014-09-06 20:35:37

+0

檢出[this](http://docs.oracle.com/javase/tutorial/java/IandI/override.html)由Oracle鏈接 – msrd0 2014-09-06 20:41:35

回答

0

static方法屬於類本身和重寫僅適用於實例方法。如果您在子類中再次定義相同的方法,則稱爲 重新定義 隱藏static方法。

static方法查找類調用它,這可以通過以下相同的代碼進行驗證:

Base b = null; 
b.show(); // Base::show() called 

它沒有任何意義,通過對象調用static方法。

+1

實際上,它被稱爲「隱藏」。不是「重新定義」。請參閱http://docs.oracle.com/javase/tutorial/java/IandI/override.html和http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls -8.4.8 – 2014-09-06 20:39:08

+0

@JBNizet謝謝讓我看看。 – Braj 2014-09-06 20:39:38

+0

@JBNizet感謝您糾正我。大部分時間我都閱讀有關重新定義的書籍。可能是他們用錯了名詞。 – Braj 2014-09-06 20:41:47