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);
        }
    }
}

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 に答える