2012-07-27 79 views
5

可能重複:
Why cant we have static method in an inner class?爲什麼非靜態的內部類不能有靜態成員(字段和方法)?

我知道一個非靜態內部類對象的創建需要一個外級對象和所創建的非靜態內部類對象自動具有對外部類的對象的隱藏引用。但爲什麼不能有一個非靜態的內部類有靜態成員? Java設計者不得不禁止在內部類的靜態方法內訪問非靜態外部類的字段,這會更有意義,非?

如果在內部類中有靜態成員沒有意義,爲什麼內部類可以通過繼承具有靜態成員的類來繼承靜態成員?

我也看過這個post。如上所述:

內部類可能會繼承不是編譯時間的靜態成員 常量,即使它們可能不會聲明它們。 不是內部類的嵌套類可以根據 隨Java編程語言的通用規則自由聲明靜態成員。

這是一個約定嗎?

這裏是我的代碼:

public class OuterClass { 

    private int outerClassField; 

    public void doSomethingOuterClass() { 
     outerClassField = 1; 
    } 

    public static void doSomethingStaticOuterClass() { 
     // outerClassField = 2; // Error: Because static method cannot access an specific object's field 
    } 

    public class InnerClass extends ClassWithStaticField { 

     // Error: Why a non-static inner class cannot have static fields ? 
     // public static int innerClassStaticField = 1; 

     public void doSomethingInnerClass() { 
      outerClassField = 3; 
      staticField = 1; 
     } 

     // Error: Why a non-static inner class cannot have static methods ? 
     // public static void doSomethingStaticInnerClass() { 
     // outerClassField = 4; 
     // } 
    } 

    public static void main(final String[] args) { 
     // If it does not make sense to have static members in an inner class, why inner class can inherit statis members by inheriting a class who has static 
     // members? 
     OuterClass.InnerClass.staticField = 1; 
     OuterClass.InnerClass.staticMethod(); 
    } 
} 

class ClassWithStaticField { 
    public static int staticField; 

    public static void staticMethod() { 
    }; 
} 
+0

另請參閱:http://stackoverflow.com/questions/2482327/why-can-we-have-static-final-members-but-cant-have-static-method-in-an-inner-cla – Autar 2012-07-27 09:19:18

回答

6

技術上有我不知道的任何理由的語言限制使用的內部類的靜態元素。 一個非靜態的內部類可以通過使用一個普通的類來模擬,該類將(之前)封閉的實例作爲參數傳遞給構造函數。當然,在可見性規則和可見性範圍方面有很多細微差別。

我認爲這是一個語言設計決定,主要是因爲非靜態內部類中的靜態變量很混亂,並且非直觀地訪問(Outer.Inner.StaticMember)。

-1

沒有非靜態內部類中提供了一個靜態方法的點。 你可以在外部類中使用非靜態方法嗎?

+0

「沒有意義」不是一個答案,也不涉及方法之外的成員數據問題。 – RichieHH 2014-03-08 22:58:29

7

1.一個Non-static inner classobject與其Outer Class(即封閉類)的instance/object相關聯。

2.Non-static inner class整個身體是一個靜態的範圍內沒有,因此,你不能有靜態成員在那裏。

3.Instance variablesmethodsnon-static inner class相對於封閉類的一個實例,因此被與對象有關,靜態不會保持爲它們真(即內部類),

4.當我們創建一個Instance非靜態inner class,我們需要一個Object of Outer enclosing class內部non-static class具有隱含參考outer enclosing class

如:

Outer o = new Outer(); 
Outer.Inner i = o.new Inner(); 
相關問題