2012-09-25 24 views
9

編碼時,我遇到了一個奇怪的Java編譯器行爲。Java編譯器錯誤益智遊戲:「內部類不能有靜態聲明」 - 除了簡單類型

編譯類(源代碼如下)時,編譯器會在NULL類變量上發出錯誤(「inner classes cannot have static declarations」)。這是預期的!

但是,ZERO類變量沒有生成錯誤。這我不明白!

爲什麼這種差異,它似乎允許內部類中的簡單類型的靜態聲明,但不允許對象。

器(javac -version:1.6.0_24)

public class Outer { 
    public static final Runnable HELLO = new Runnable() { 
     // No compiler error 
     public static final int ZERO = 0; 

     // Causes compiler error: "inner classes cannot have static declarations" 
     public static final Object NULL = null; 

     @Override 
     public void run() { 
      System.out.println("Hello " + ZERO + NULL); 
     } 
    }; 
} 
+0

我認爲這是因爲priomitive變量將被視爲一個常量和編譯的* inline *,而'Object'引用不會。我記得在這個YouTube視頻中看到了一些關於編譯器如何處理帶有'null'參數的常量:http://www.youtube.com/watch?v=V1vQf4qyMXg&t=68m1s – Magicode

+0

無論是空引用還是「新對象()「引用沒有區別,都會導致編譯器錯誤。 – Morten

回答

14

的問題是,內類不能有其中需要初始化非平凡的常數和非常量的靜態初始化劑塊。

+1

+1;有人可能會爭辯說,錯誤信息不是很明確。第一個聲明也是'static'。 – maba

+0

也不知道爲什麼內部類不能有一個靜態的初始化塊。 :| –

+0

如果內部類不能有靜態初始化塊,爲什麼你可以初始化一個靜態簡單類型類變量? Java語言規範的哪個部分允許使用一個,但不允許使用其他部分。 我其實認爲真正的問題是沒有爲簡單類型變量(靜態字段)生成編譯器錯誤。 – Morten