3

静的と非静的の概念に苦労しています。私はこの Thread サンプル プログラム (修正済み、元はここから) を勉強していますが、内部クラスを使用するとエラーが発生します。

Error: non-static variable this cannot be referenced from a static context

エラーの原因となるコードは次のとおりです。

public class Main2 {
    public static void main(String[] args) {
        Thread simple = new Thread(new SimpleTask());
        simple.start();
    }


    class SimpleTask implements Runnable {
        public void run() {

        }

        ;
    }

    class DaemonTask implements Runnable {
        public void run() {
            int i = 0;
        }
    }

}

ただし、3つのクラスになるように分割すると、エラーは発生しません..つまり、次のようにします。

public class Main2 {  
   /* contents */  
}

class SimpleTask implements Runnable {
   /* contents */
}

class DaemonTask implements Runnable {
   /* contents */
}

その後、問題なくコンパイルされます。それを別のクラスに分割することがなぜ重要なのですか?

4

5 に答える 5

4

内部クラス インスタンス (SimpleTask) にアクセスするには、外部クラス インスタンス (Main2) が必要です。

これを試して:

    Thread simple = new Thread(new Main2().new SimpleTask());

Oracle Trail の内部クラスを確認する

于 2013-03-22T17:01:15.373 に答える
3

クラスは非静的内部クラスであるため。外部クラスの対応するインスタンスが暗黙的に必要です。

内部クラスを として宣言するstaticと、問題が解決するはずです。

于 2013-03-22T16:59:01.363 に答える
1

問題は「Thread simple = new Thread(new SimpleTask());」の行にあります。クラス SimpleTask はネストされたクラスとして定義されているため、外側のクラスのオブジェクトを作成する必要があります (通常のメソッドが現在のクラス インスタンスへの暗黙的な参照を次のように取得するのと同様に、コンストラクターは基本的に、含まれるクラスへの暗黙的な参照を必要とします)。 'これ')。ここで本質的に求めているのは、「Thread simple = new Thread(null.new SimpleTask());」です。そして、例外を引き起こしているのはこの「null」です。

于 2013-12-04T23:28:48.990 に答える
1

SimpleTaskDemonTaskクラスは静的でなければなりません


Instance members(あなたの場合SimpleTaskDemonTask)はクラスの特定のオブジェクトに関連付けられています。そのため、インスタンスメンバーを静的メソッド内で直接使用することはできません(インスタンス自体を次のように渡さない限り、静的メンバーにはクラスのインスタンスに関する情報がないため)パラメータ)

オブジェクトを作成してMain2アクセスし、それSimpleTaskDemonTask介してアクセスする必要がありますnew Main2().new SimpleTask()

また

これら2つのクラスを静的にする

于 2013-03-22T16:59:12.927 に答える
1

class SimpleTask implements Runnable静的にしてみてください。

そのようなクラスを宣言するとき、インスタンスごとのクラス定義の一部を宣言しています。より正確には、 のクラス定義SimpleTaskを のインスタンスに関連付けていますMain2

そのクラスのオブジェクトをインスタンス化するには、次のようにします。

Main2 obj = new Main2();
SimpleTask t = obj.new SimpleTask();

の使用に注意してくださいobj.new。外部クラス内からそれを呼び出すと、実際にはthis.new. 静的メソッドは を認識しないthisため、エラーが発生します。

于 2013-03-22T16:59:13.133 に答える