2014-05-05 24 views
0

我試着去理解類是如何內部工作,雖然有一些簡單的代碼嘗試,我得到一個錯誤:The method hello cannot be declared static; static methods can only be declared in a static or top level type錯誤在一個內部類的靜態方法

這個代碼

public class Class1 { 
    public static void main(String[] args) { 
     Class1 c = new Class1(); 
     c.show(); 
    } 

    public static void show() { 
     class C2 { 

      static public void hello() { 
       System.out.println("show class"); 
      } 
     } 

     C2.hello(); 
    } 

} 

和我不能理解爲什麼!

+0

因爲它在Java語言規範中被指定。 – Henry

+0

[this](http://stackoverflow.com/a/975173/2764279)可能會幫助你 –

+0

謝謝,我沒有注意到我的搜索發佈! –

回答

2

請參閱documentation here

內部類:與實例方法和變量一樣,內部類與其包含類的實例關聯,並且可以直接訪問該對象的方法和字段。另外,因爲內部類與一個實例相關聯,所以它不能自己定義任何靜態成員。

0

你不能這樣做,因爲你需要先創建Class'Class1'的實例,然後才能訪問Class'C2'。然而,'hello'方法應該可以在不創建實例的情況下進行訪問(作爲靜態方法)。

+0

我做了一個在主要方法中的Class1的實例,但它仍然不起作用:/ –

+0

右..這就是爲什麼限制是從編譯器施加的。您需要創建一個實例來訪問這些靜態函數。 –

1

上面例子中的C2類是一個本地的Inner類,它意味着在外部類的方法中定義的內部類,並且這些類不能在它們內部具有靜態方法,因爲它們與對象相關聯(靜態方法是不依賴於對象)。此外,必須在創建方法內部實例化本地內部類,而不是在方法外部實例化內部類。這是一條規則。

嘗試以下方式修改代碼:

public class Class1 { 
    public static void main(String[] args) { 
     Class1 c = new Class1(); 
     c.show(); 
} 

public static void show() { 
    class C2 { 

     public void hello() { 
      System.out.println("show class"); 
     } 
    } 

    C2 obj= new C2(); 
obj.hello(); 
} 

} 

這應該工作。

1

Class2是一個內部類,它意味着它需要綁定到一個Class1對象。於是Class2中的對象可以在任何時候訪問綁定對象的字段:

public class Class1 { 

    private String name = "class1"; 

    public static void main(String[] args) { 
     Class1 a = new Class1(); 
     Class2 c = a.new Class2(); 
     c.show(); 
    } 

    class Class2 { 
     public void show() { 
      System.out.println("helloworld: "+name); //accessing the name field of a without needing the variable 
     } 
    } 

} 

,或者你需要做的Class2靜態的,因此它不需要Class1的實例。

public class Class1 { 
    public static void main(String[] args) { 
     Class2 c = new Class2(); 
     c.show(); 
    } 

    static class Class2 { 
     public void show() { 
      System.out.println("helloworld"); 
     } 
    } 

} 
+0

謝謝你的回答,但從記憶的角度來看,你推薦第一或第二代碼?再次感謝你 –

+0

@ p3rand0r他們有非常不同的用例,但選項2不需要第二個對象 –

相關問題