2011-11-25 113 views
10
enum Animals{ 
    DOG("woof"), 
    CAT("Meow"), 
    FISH("Burble"); 

    String sound; 

    Animals(String s) { 
      sound = s; 
    } 
} 
public class TestEnum{ 
    static Animals a; 
    public static void main(String ab[]){ 
     System.out.println(a); 
     System.out.println(a.DOG.sound + " " + a.FISH.sound); 
    } 
} 

在上面的例子中,當a爲空且枚舉未聲明爲靜態時,爲什麼我們能夠訪問枚舉實例(即作爲a.DOG.sound)? 默認情況下枚舉實例是靜態的嗎?默認情況下枚舉的實例是靜態的嗎?

+0

枚舉值和'static'之間的唯一區別是你不能在枚舉值之前放置一個'static {}'塊。 –

+2

這個問題爲什麼標記爲scjp? – OldCurmudgeon

回答

22

枚舉暗含public static final

你可以參考a.DOG因爲你可能訪問靜態成員通過實例引用,即使空:靜態解析使用參考,而不是實例。

I 不會;這是誤導性的:約定有利於類型(不是實例)靜態引用。

請參閱JLS 6.5.6.2關於通過實例的類變量。請參閱JLS 15.11爲什麼它仍然與null一起使用。 Nutshell:這是參考類型,而不是實例,通過它來解決靜態問題。


更新鏈接:/

JSE 6

JSE 7

JSE 8

6

是的,枚舉實際上是靜態的。