サブクラスで定義されたオブジェクトの配列を作成しようとしています(これが正しい用語だと思います)。質問が繰り返されていることがわかりますが、実装にはまだ問題があります。
私のコード
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がオブジェクト指向プログラミングへの私の最初のディップであることを知っておくと便利かもしれません。
理由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つの関連する質問があります:
class
MyClass
はinner class
、およびサブクラスではありません。非静的内部クラスには、内部クラスを囲むクラスのオブジェクトを作成することでアクセスできます。したがって、内部クラスにアクセスする場合は、最初に外部クラスのオブジェクトを作成する必要があります。あなたはそれを行うことができます:
Test t = new Test();
MyClass[] foo = new MyClass[10];
foo[0] = t.new MyClass();
foo.bar = 0;
最後に直面した問題(「インスタンスを囲まない」)は、実際には配列とはまったく関係ありません。
最後のコードブロックを次のように置き換えてみてください。
MyClass foo = new MyClass();
配列が含まれていなくても、まったく同じエラーメッセージが表示されます。
ここでの問題は、非静的内部クラスがその外部インスタンスへの暗黙の参照を持っていることです。外部インスタンスがないため(静的コンテキストにいるため、this
はありません)、MyClass
インスタンスを作成することはできません。
あなたおそらくは内部クラスを必要とせず、必要とせず、単にstatic
にすることができます:
private static class MyClass
また、コードがint
ではなくMyClass
で機能する理由は、int[]
はint
値(int
はプリミティブ型)を保持しますが、MyClass[]
ホールドMyClass
参照(MyClass
は参照型です)。
静的main
メソッド内から非静的内部クラスを使用することはできません。
解決策は、MyClass
をprivate static class
として宣言することです。