2013-08-30 62 views
5
public class Application { 
    public static void main(String[] args) { 
     final class Constants { 
      public static String name = "globe"; 
     } 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println(Constants.name); 
      } 
     }); 
     thread.start(); 
    } 
} 

編譯錯誤:The field name cannot be declared static in a non-static inner type, unless initialized with a constant expression錯誤:字段名稱不能被聲明爲static

解決這個?

+0

您是否嘗試將'Constants'設爲靜態類型? –

+0

不在常量中聲明字符串或使最終類常量也是靜態的(並且可能不會在主方法中聲明它)。 – Matthias

回答

8

Java不允許您在函數本地內部類中定義非最終靜態字段。只有頂級類和靜態嵌套類才允許有非最終靜態字段。

如果你想在你Constantsstatic場,把它放在Application一流水平,是這樣的:

public class Application { 
    static final class Constants { 
     public static String name = "globe"; 
    } 
    public static void main(String[] args) { 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println(Constants.name); 
      } 
     }); 
     thread.start(); 
    } 
} 
+2

你的第一句話是不正確的 - 如果該字段在原始代碼中被編譯爲'final',它將被編譯,因爲它是用一個常量值初始化的。 –

+0

現在變量'name'應該聲明爲final# –

+1

@micro.pravi:如果你使它成爲'final',你可以使'Constants'成爲一個本地類。 –

6

JLS section 8.1.3

Inner classes may not declare static members, unless they are constant variables (§4.12.4), or a compile-time error occurs.

這麼說,你很好,如果你只是讓變量final

public class Application { 
    public static void main(String[] args) { 
     final class Constants { 
      public static final String name = "globe"; 
     } 
     Thread thread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       System.out.println(Constants.name); 
      } 
     }); 
     thread.start(); 
    } 
} 

當然,如果你需要用一個非常數值來初始化它,這將不起作用。

說了這麼多,這是一個不尋常的設計,國際海事組織。根據我的經驗,根本看不到有名的本地班。你需要這是一個本地班嗎?你想達到什麼目的?

相關問題