0

今日、静的なネストされたクラスについて読んでいましたが、以下のコードのために少し混乱しています。

class testOuter {
    int x;
     static class inner {
       int innerVar; 
    public void testFunct() {
        x = 0;       // Error : cannot make static reference to non static field
        innerVar = 10;
        outerFunc(this);
     }
     }
     static void outerFunc(SINGLETON s) {
         
     }
}

ネストされた静的クラスについて私が理解したことは、それが外部クラスの静的メンバーのように動作することです。静的変数のみを参照でき、静的メソッドを呼び出すことができます。上記のコードから、エラー atx=0は問題ありません。

しかし、私が混乱しているのは、それが静的ブロックのように動作する場合、静的ではないinnerVarを変更できることと、このポインターをどのように持つことができるかということです。したがって、ネストされたクラスが静的である場合、メソッドは暗黙的に静的であるか、静的ではありませんか?

4

4 に答える 4

1

static int xの代わりに書くint xとうまくいきます。あなたが言ったように、静的内部クラスは外部クラスの静的メンバーにのみアクセスできます。はコード内で静的ではないためx、アクセスできません。

PS

通常のクラスはすべて静的であることに注意してください。つまり、アプリケーションの実行ごとにクラス情報のインスタンスが 1 つ存在します。したがって、内部クラスが であることを宣言するときはstatic、それが通常のクラスと同じであると述べるだけです。

反対に、非静的内部クラスは異なります。非静的内部クラスの各インスタンスはクロージャーです。つまり、外部クラスのいくつかのインスタンスに関連付けられています。つまり、外部クラスのインスタンスを考慮せずに非静的内部クラスのインスタンスを作成することはできません。

PPS

申し訳ありませんが、 と を強調表示していませんでしthisinnerVar。どちらも内部クラスの非静的メンバーであるため、アクセスできます。OUTER クラスに属している場合にのみ、非静的メンバーにアクセスすることはできません。

于 2013-02-09T10:28:31.850 に答える
1

this他のクラスと同じ意味です。instanceクラスの流れを指します。静的内部クラスはインスタンス化できます (通常はインスタンス化されます):

Inner inner = new Inner();

静的内部クラスは、他のクラスとまったく同じように機能します。唯一の違いは、それを含むクラスに対してプライベートにすることで、他のクラスから見えないようにできることです。

コンパイル例:

public class Course {
    private List<Student> students;

    public Course(Collection<Student> students) {
        this.students = new ArrayList<>(students);
        Collections.sort(this.students, new StudentComparator(-1));
    }

    private static class StudentComparator implements Comparator<Student> {
        private int factor;
        StudentComparator(int factor) {
            this.factor = factor;
        }

        @Override
        public int compare(Student s1, Student s2) {
            return this.factor * (s1.getName().compareTo(s2.getName());
        }
    }
}
于 2013-02-09T10:29:56.593 に答える
0

しかし、私が混乱しているのは、静的ブロックのように動作する場合、静的ではないinnerVarを変更できることです

静的内部クラスから、外部クラスの非静的メンバーを参照することはできません。 innerVar静的内部クラスに属しているため、アクセス中にエラーは発生しません。

于 2013-02-09T10:36:46.940 に答える
0
class testOuter {
   static int x;

   static class inner {
     int innerVar; 
     public void testFunct() {
       x = 0;       
       innerVar = 10;
     }
   }

   static void outerFunc(SINGLETON s) {
   }
}
于 2013-02-09T10:34:23.537 に答える