5

サブクラスで定義されたオブジェクトの配列を作成しようとしています (これが正しい用語だと思います)。疑問が繰り返されていることがわかりますが、実装にはまだ問題があります。

私のコード

public class Test {

    private class MyClass {
        int bar = -1;
    }

    private static MyClass[] foo;

    public static void main(String args[]) {

        foo = new MyClass[1];
        foo[0].bar = 0;

    }       
}

エラーを与える

スレッド「メイン」での例外 java.lang.NullPointerException.

それを合理化するために、私はそれを最も簡単な言葉に分解しました:

public class Test {

    private static int[] foo;

    public static void main(String args[]) {

        foo = new int[1];
        foo[0] = 0;

    }       
}

これはうまくいくようです。私の2つの例の違いはわかりません。(私の最初が無意味であることは理解していますが、MyClass には最終的により多くのデータが含まれます。)

質問はここで尋ねられ、非常によく答えられていると確信しています。私は解決策を実装したと思います:

MyClass[] foo = new MyClass[10];
foo[0] = new MyClass();
foo[0].bar = 0;

しかし、上記の2行目でエラーが発生します

タイプ Test の外側のインスタンスにアクセスできません。

ArrayList が前進する方法であることは理解していますが、根本的な概念を理解しようとしています。

注意 - プログラミング全般には非常に慣れていますが、Java はオブジェクト指向プログラミングへの最初のディップであることを知っておくと役立つかもしれません。

4

4 に答える 4

6

class MyClassであり、サブクラスではありませinner classん。非静的内部クラスには、内部クラスを囲むクラスのオブジェクトを作成することによってアクセスできます。したがって、内部クラスにアクセスする場合は、最初に外部クラスのオブジェクトを作成する必要があります。次の方法で実行できます。

Test t = new Test();
MyClass[] foo = new MyClass[10];
foo[0] = t.new MyClass();
foo.bar = 0;
于 2013-05-06T10:22:58.933 に答える
3

理由intは機能しますが、MyClass機能しません:

ここから:

Data Type               Default Value (for fields)
byte                    0
short                   0
int                     0
long                    0L
float                   0.0f
double                  0.0d
char                    '\u0000'
String (or any object)  null
boolean                 false

配列を初期化すると、すべての要素がデフォルト値になります。

したがって、を初期化するint[]と、すべての要素が 0 になるため、それを使用したり、新しい値を割り当てたりしても問題ありません。

ただし、 を初期化するMyClass[]と、すべての要素がnullになります。これは、要素の 1 つのメンバーにアクセスしようとすると問題になります。

オブジェクトのメンバーにアクセスできない理由がわからない場合はnull、おそらく 2 歩戻って Java の本を読む必要があります。

追記:

技術的には、これは:

int[] foo = new int[1];
foo[0] = 0;

実際には次のようになります。

MyClass[] foo = new MyClass[10];
foo[0] = new MyClass();

いいえ:

MyClass[] foo = new MyClass[10];
foo[0].bar = 0;

要素のメンバーにアクセスするのではなく、要素に新しい値を割り当てているためです。

タイプ Test の外側のインスタンスにアクセスできません:

他の回答はそれをかなりうまくカバーしており、ここに3つの関連する質問があります:

タイプの外側のインスタンスにアクセスできません。

タイプ Server の外側のインスタンスにアクセスできません

Android で別のクラスからメソッドを呼び出しているときに「タイプのエンクロージング インスタンスがありません」エラー

于 2013-05-06T10:36:28.777 に答える