- - PR -
初歩的なことで申し訳ないのですが誰か回答してくれませんか
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-05-16 18:51
public class P1 { protected String age = null; public String getAge(){ return age; } public P1(){ age = new String("11"); } } public class A1 { public A1() { create(); } protected void create() { System.out.println("A1.Create"); } } public class A2 extends A1{ protected P1 pp = null; public P1 getP1(){ return pp; } public A2() { } protected void create(){ System.out.println("A2.Create"); pp = new P1(); System.out.println(pp.getAge()); } } public class T1 { public static void main(String[] args) { A2 obj = new A2(); P1 obj2 = obj.getP1(); System.out.print(obj2.getAge()); } } 上記のようなソースでT1を実行すると System.out.print(obj2.getAge()); でエラーになります。 初期化の順序による問題であろうとは想像できるのですが、 具体的な理由がわかりません。 大変申し訳ないのですが、何方かご教授お願いします。 | ||||||||
|
投稿日時: 2006-05-16 19:02
A2クラスのcreateを実行していないため
obj.getP1()がnullを返します。 そのため、obj2.getAge()でNullPointerExceptionが 発生します。 | ||||||||
|
投稿日時: 2006-05-16 19:08
早速の回答ありがとうございます。
実行してみたところ、”A2.Create”が出力されるので、A2.Createが動作 しているように思っていたのですが。。。。。。 | ||||||||
|
投稿日時: 2006-05-16 19:34
失礼します。
T1クラスにて、上記のオブジェクト生成を行なう際に、 A1の初期化処理 → A2createを実行 → A2の初期化処理 の順番で実行されます。 最後の『A2の初期化処理』において、
この1行が実行されます。 なので、NullPointerExceptionになります。 | ||||||||
|
投稿日時: 2006-05-16 19:47
なるほど納得いたしました。
print文を入れて確認できました。 ご回答していただいた皆様大変ありがとうございました。 | ||||||||
|
投稿日時: 2006-05-17 12:37
スーパークラスを継承したサブクラスのインスタンスを作った場合の挙動チェック
実行スレッドで B _b =new B();//7番呼び出し とやった場合、 15238678 の順で実行されるんですね。 5678だけかと思ってた・・・。 まさかインスタンスメソッドが、コンストラクタやインスタンスイニシャライザより早く実行される事がありうるとは。 7を消して同じ実行を行っても、最後の78が無いという以外は実行順序その他は変わりませんでした。 |
1