1. 程式人生 > >【Java語法】java中成員內部類內為什麼不允許有任何靜態宣告搜尋

【Java語法】java中成員內部類內為什麼不允許有任何靜態宣告搜尋

看下內部類Eclipse給的錯誤我們可以看出一部分,靜態的屬性或者方法不允許宣告在非靜態的物件中.

  下面我們看下think in java 中談內部類

  內部類自動獲得對其外圍類所有成員的訪問權,這是如何做到的?
當某個外圍類建立了一個內部類物件時,此內部類物件必定祕密捕獲一個指向那個外圍類物件的引用.然後,在你訪問此外圍類的成員時.就是用那個引用來選擇外圍類的成員,幸運的是,編譯器會幫你處理所有的細節,但你現在可以看到:內部類的物件只能在於其外圍類的物件相關聯的情況下才能被建立(非static內部類).

下面說下我自己想法和綜合網上的想法

  1. 重點在於內部類比如和外部類有聯絡,如果我們建立了static的方法或者欄位就破壞了這種耦合,和java的設定背道而馳.如果一個非靜態內部類有了靜態成員,靜態成員不依託於任何內部類例項,那結果也就是此內部類不需要外部類例項就初始化了變數,嚴重侵害了內部類的定向

  2. 內部類的物件 脫離了其外圍類的物件 就不會存在, 靜態變數 的作用就是 讓該類的所有物件共享一個狀態。 這個類的所有物件都可以獲取和修改這個狀態。如果僅僅是這個目的,就可以推出這個狀態也是所有外部物件所共享的狀態,因此這個定義就可以提升至 外圍類中定義,沒有必要在內部類中定義,因此在JAVA中不允許在內部類中宣告 靜態變數

  3. 如果我們不從抽象的語義方面去理解, 可以這麼想:

    public class Outter {
       class Inner{
           static Inner a1=new Inner();
       }
    }

    如果上面的程式碼編譯無誤, 我們可以直接 Outter.Inner.a來拿到Inner類的例項, 而內部類的例項是一定要繫結到一個外部類的例項的. 然後java裡試圖用final來為上述限制鬆綁, 以提供更多的靈活性.

感覺沒有語法什麼方面的問題,主要還是為了內部類的定義,不想超脫原來的範圍

另外說下final 那個成功的原因:

    不是你聲明瞭final就可以成功的,只能是編譯器知道其值,然後編譯器把他當做編譯期常量來使用,其實說白了就是和這個類沒啥關係了,只是你寫那裡了,但是沒啥卵用,如果你改成可變的就是執行期確定值這個就是不能被編譯通過的