3

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

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

源: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规范吗?

抱歉格式化,我在浏览器+帖子编辑器上苦苦挣扎。

4

3 回答 3

8

没有直接访问实例成员。

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

于 2013-01-16T02:17:37.787 回答
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);
于 2013-01-16T02:22:37.290 回答
1

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

这不会编译

System.out.println(member);

编译器消息:

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

于 2013-01-16T02:28:52.973 回答