web-dev-qa-db-ja.com

Java)でオブジェクトの配列を作成する方法

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

私のコード

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がオブジェクト指向プログラミングへの私の最初のディップであることを知っておくと便利かもしれません。

5
KDM

理由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になります。これは、いずれかの要素のメンバーにアクセスしようとすると問題になります。

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つの関連する質問があります:

タイプの囲んでいるインスタンスにアクセスできません。

サーバータイプの囲んでいるインスタンスにはアクセスできません

Androidで別のクラスからメソッドを呼び出しているときに「型のインスタンスを囲んでいません」エラーが発生しました

3
Dukeling

classMyClassinner class、およびサブクラスではありません。非静的内部クラスには、内部クラスを囲むクラスのオブジェクトを作成することでアクセスできます。したがって、内部クラスにアクセスする場合は、最初に外部クラスのオブジェクトを作成する必要があります。あなたはそれを行うことができます:

Test t = new Test();
MyClass[] foo = new MyClass[10];
foo[0] = t.new MyClass();
foo.bar = 0;
6
Rahul Bobhate

最後に直面した問題(「インスタンスを囲まない」)は、実際には配列とはまったく関係ありません。

最後のコードブロックを次のように置き換えてみてください。

 MyClass foo = new MyClass();

配列が含まれていなくても、まったく同じエラーメッセージが表示されます。

ここでの問題は、非静的内部クラスがその外部インスタンスへの暗黙の参照を持っていることです。外部インスタンスがないため(静的コンテキストにいるため、thisはありません)、MyClassインスタンスを作成することはできません。

あなたおそらくは内部クラスを必要とせず、必要とせず、単にstaticにすることができます:

private static class MyClass

また、コードがintではなくMyClassで機能する理由は、int[]intintはプリミティブ型)を保持しますが、MyClass[]ホールドMyClass参照MyClassは参照型です)。

3
Joachim Sauer

静的mainメソッド内から非静的内部クラスを使用することはできません。

解決策は、MyClassprivate static classとして宣言することです。

0
Tony the Pony