2014-01-08 116 views
3

我看到一个奇怪的情况,并想知道我是否错过了一些东西。我有一类这样定义java枚举访问问题由变量

public class Foo { 
    public enum Day { Monday, Tuesday, ...}; 
    ... 
} 

然后在另一个类枚举我有

public class Bar { 
    Foo aFoo=new Foo(); 

    void test(){ 
     System.out.println(Foo.Day.Monday); // ok 
     System.out.println(aFoo.Day.Monday); // complie error Day not accessible 
    } 
} 

任何人都有对此的解释?谢谢。

+0

请参阅以下java文档http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html –

回答

5

的原因是when you have an expression like Q.Id and Q is an expression of type T(Q是你aFooT = Foo):

如果没有的类型T的只有一个访问(6.6节)成员这是一个名为Id场,那么会发生编译时错误。

换句话说,您可以通过实例(aFoo.someStaticVariable)引用静态字段,但不能嵌套类。

所以你需要使用Outerclass.Nestedclass来访问它。

+0

谢谢。它解释了为什么,但我不明白你的“顺便说一句”部分。 – user3097579

+0

这是一个侧面说明,但它不是行为的原因:在'someInstance.f'中,'f'必须是一个字段,无论是否为静态 - 'f'不能是类名。为了清晰我编辑过。 – assylias

+0

默认情况下,'enum'是'static'(请参阅答案中的链接),这意味着'Foo'的所有实例都是相同的。所以通过实例访问它并不是很有用,但通过类本身访问它是有用的。这是基本的想法。 –

3

JLS §8.9

嵌套枚举类型隐含static。允许显式声明一个嵌套的枚举类型为static

因此,通过Foo实例访问Day是没有意义的;它只能通过Foo类本身进行访问,就像在您的第一个打印语句中一样。

+2

所有其他静态内容均可由实例访问。为什么不枚举? – user3097579

+0

通过类实例访问静态字段是邪恶的。也许Java设计师意识到这一点,并不想在开放性伤口中添加更多硫。 :) – Natix

+0

@ user3097579非静态嵌套类,它是一个嵌套的枚举。 – arshajii