2013-09-24 116 views
0
public class StaticInnerClass { 
public static void main(String[] args) { 


    //Outers out=new Outers(); 
    Outers.Inner1 in=new Outers.Inner2(); 
    in.display(); 
} 
} 

class Outers 
{ 
static class Inner1 
{ 
    static void display() 
    { 
     display(); 
     System.out.println("Inner1"); 
    } 
} 

static class Inner2 extends Inner1 
{ 
    static void display() 
    { 

     System.out.println("Inner2"); 
    } 
} 
} 

上述程序給出了一個stackoverflow錯誤。請解釋爲什麼它不顯示「Inner1」,因爲靜態方法不會覆蓋。覆蓋靜態內部類的靜態方法的Stackoverflow錯誤

+0

您正在遞歸調用'display()'。 –

回答

7

執行靜態方法是基於靜態類型,而不是實例類型:

Outers.Inner1 in=new Outers.Inner2();

所以,當你調用這一行,靜態類型爲Outers.Inner1,因此它調用的顯示方法是這個類的一部分,它重複地調用它自己(導致StackOverflowError)。

+1

「靜態類型」表示編譯器所看到的變量類型 - 不是對象的運行時類型,因爲它與非靜態方法一樣。 –

1

靜態方法不是多態調用的!

這將導致方法顯示一次又一次地調用自身,直到出現堆棧溢出錯誤。另外,看到這個問題:Polymorphism and Static Methods

0
  1. 靜態方法不能被子類覆蓋
  2. 靜態方法應該被稱爲與不類與對象,即使你使用的對象,但它仍然要使用對象的類型。
+0

實際上你可以'override'(定義一個具有相同簽名的方法),但是基類中的方法將被調用。 –