- PR -

初歩的なことで申し訳ないのですが誰か回答してくれませんか

1
投稿者投稿内容
k5
会議室デビュー日: 2004/04/27
投稿数: 10
投稿日時: 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());

でエラーになります。
初期化の順序による問題であろうとは想像できるのですが、
具体的な理由がわかりません。

大変申し訳ないのですが、何方かご教授お願いします。
zilloll
常連さん
会議室デビュー日: 2006/02/01
投稿数: 24
投稿日時: 2006-05-16 19:02
A2クラスのcreateを実行していないため
obj.getP1()がnullを返します。
そのため、obj2.getAge()でNullPointerExceptionが
発生します。
k5
会議室デビュー日: 2004/04/27
投稿数: 10
投稿日時: 2006-05-16 19:08
早速の回答ありがとうございます。

実行してみたところ、”A2.Create”が出力されるので、A2.Createが動作
しているように思っていたのですが。。。。。。
Cafe
会議室デビュー日: 2005/09/10
投稿数: 12
投稿日時: 2006-05-16 19:34
失礼します。

コード:
 A2 obj = new A2(); 


T1クラスにて、上記のオブジェクト生成を行なう際に、
A1の初期化処理 → A2createを実行 → A2の初期化処理
の順番で実行されます。

最後の『A2の初期化処理』において、
コード:
 protected P1 pp = null;



この1行が実行されます。

なので、NullPointerExceptionになります。
k5
会議室デビュー日: 2004/04/27
投稿数: 10
投稿日時: 2006-05-16 19:47
なるほど納得いたしました。
print文を入れて確認できました。

ご回答していただいた皆様大変ありがとうございました。
ほまらら
ベテラン
会議室デビュー日: 2005/10/19
投稿数: 54
投稿日時: 2006-05-17 12:37
スーパークラスを継承したサブクラスのインスタンスを作った場合の挙動チェック
コード:
class A{
	static{}//..........1
	{}//................2
	public A{C();}//....3
	public void C(){}//.4
}
class B extends A{
	static{}//..........5
	{}//................6
	public B{C();}//....7
	public void C(){}//.8
}



実行スレッドで
B _b =new B();//7番呼び出し
とやった場合、
15238678
の順で実行されるんですね。
5678だけかと思ってた・・・。
まさかインスタンスメソッドが、コンストラクタやインスタンスイニシャライザより早く実行される事がありうるとは。
7を消して同じ実行を行っても、最後の78が無いという以外は実行順序その他は変わりませんでした。
1

スキルアップ/キャリアアップ(JOB@IT)