Java中的静态嵌套类

时间:2013-01-16 02:15:58

标签: java inner-classes static-members

我不确定为什么这段代码会编译...引用Java教程:

  

与静态类方法一样,静态嵌套类不能直接引用其封闭类中定义的实例变量或方法 - 它只能通过对象引用来使用它们。

Src:http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

public class StaticNested {

    private String member;
    private static String staticMember;

    static class StaticNestedClass {
        private void myMethod() {
            System.out.println(staticMember);
            StaticNested nested = new StaticNested();
            System.out.println(nested.member);
        }
    }
}

我没想到能够直接访问成员,但代码编译得很好。我误解了Java规范吗?

对格式化感到抱歉,我正在努力使用我的浏览器+帖子编辑器。

3 个答案:

答案 0 :(得分:8)

直接访问实例成员。

staticMember正在访问非实例成员,nested.member正在通过对象引用访问一个。

答案 1 :(得分:2)

这是正确的行为。什么规范意味着(在您的代码示例中)您无法直接在静态嵌套类中访问非静态成员字段String member,如

public class StaticNested {

    private String member;
    private static String staticMember;

    static class StaticNestedClass {
        private void myMethod() {
            System.out.println(staticMember);
            System.out.println(member);//<-here you will get compilation error
        }
    }
}

但是因为非静态字段属于类的对象,所以可以像代码一样参考该对象来访问它

StaticNested nested = new StaticNested();
System.out.println(nested.member);

答案 2 :(得分:1)

您正在通过实例(非静态)访问它。

编译:

System.out.println(member);

编译器消息:

  

无法对非静态字段成员进行静态引用