• ベストアンサー

クラスから自分のオブジェクトを操作するには

高橋麻奈著の「やさしいJava」を買って、Javaプログラミングをはじめたのですが、どうしても分からないことがあるので質問させてください。 次のようなコードがあります。 class Abc{  public static void main(String arg[]){   Def de = new Def();   de.object_null();   Def de2 = new Def();   de2.object_null();   Ghi gh = new Ghi();   gh.object_null();  } } class Def{  int d,e,f;  Abc abc;  Def(Abc a,int i1,int i2){   //略  }  public void object_null(Abc a){   abc = a;   abc.de = null;  } } class Ghi extends Def{  Ghi(Abc a,int i1,int i2){   super(a,i1,i2);  } } Defクラス側から自分自身のクラス変数deをnullにする場合、public void object_null()メソッドのような方法でクラス変数を指定してnullにしていました。 しかし、この場合、クラス変数de2のobject_null()メソッドではde2をnullできないし、 サブクラスGhiから、クラス変数ghをnullにする場合も、クラス変数deを指定してしまいます。 クラス側から自分自身のクラス変数を指定する良い方法を教えてください。 よろしくお願いします。 #ここは半角スペース無効なんですね(^^;

質問者が選んだベストアンサー

  • ベストアンサー
  • kacchann
  • ベストアンサー率58% (347/594)
回答No.6

import java.lang.reflect.*; //クラスAbc class Abc { public Def de, de2; public Ghi gh; public Abc() { de = new Def(this); de2 = new Def(this); gh = new Ghi(this); System.out.println("----操作前----"); System.out.println(de); System.out.println(de2); System.out.println(gh); de2.object_null(); gh.object_null(); System.out.println("----操作後----"); System.out.println(de); System.out.println(de2);//nullのはず System.out.println(gh);//nullのはず } public static void main(String[] args) { Abc user = new Abc(); } } //クラスDef class Def { Abc abc; public Def(Abc user) { abc = user; } public void object_null() { try { Class cls = Class.forName(abc.getClass().getName()); Field[] fieldList = cls.getFields(); for (int i=0;i<fieldList.length;i++) { Field fld = fieldList[i]; if (fld.getType().getName() .equals(getClass().getName())) { if (this == (Def)fld.get(abc)) { fld.set(abc, null); } } } }catch(Exception e) {e.printStackTrace();} } } //クラスGhi class Ghi extends Def { public Ghi (Abc user) { super(user); } }

noname#6927
質問者

お礼

回答ありがとうございます。 なるほど~リフレクションAPIを使うんですね。 気になってはいたのですが、 実際使ったことがなく、仕組みも理解していませんでした。 もし良かったら、参考文献or参考URLなど教えていただけませんか?

noname#6927
質問者

補足

ANo.#5様 レス付け間違えたのはANo.#4様に対してでした。 失礼しました。

その他の回答 (5)

回答No.5

わからないのでコメント付けてみました。 -------------------------------------------------- import java.applet.Applet; public class Abc extends Applet{ Def de,de2; Ghi gh; public void init(){ de = new Def(this,1,2);//(1).Abc(自分自身)のインスタンス変数deに新規Defインスタンスの参照をセット de.object_null(this);//(2).Abc(自分自身)の参照を渡す //--------------------------- //(2)をこのクラス上で行うと de.abc = this;//(3)の処理 de = null;//(4)の処理 //--------------------------- de2 = new Def(this,1,2); de2.object_null(this); gh = new Ghi(this,1,2); gh.object_null(this); } } class Def{ int d,e,f; Abc abc; Def(Abc a,int i1,int i2){ //略 } public void object_null(Abc a){ abc = a;//(3).(2)から渡されたABCインスタンスの参照をDefインスタンスdeのインスタンス変数abcにセット。 abc.de = null;//(4).abcのインスタンス変数deにnullをセット } } class Ghi extends Def{ Ghi(Abc a,int i1,int i2){ super(a,i1,i2); } } -------------------------------------------------- de.object_null(this);が de.abc = this; de = null; に置き換えられるのわかりますか? >どのDefクラス変数でも自分のメソッドの中で >自分自身を操作できるようにする方法が知りたいのです。 意味が汲み取れません。 Defクラスの中にmainメソッドつくるとか、ゲッター、セッターメソッドを作るとかそういう意味ですか?

noname#6927
質問者

お礼

レスつけ間違いました。 失礼しました。

noname#6927
質問者

補足

>どのDefクラス変数でも自分のメソッドの中で >自分自身を操作できるようにする方法が知りたいのです。 Def de,de2,de3; とクラス変数があるとして、 de.object_null(); を実行すると、クラス内部でメソッドを呼び出したdeを特定してdeだけが削除されるという意味です。 クラスDef内の記述で、クラス変数の名前や場所を具体的に記述してなくても、 Defクラスメソドを呼び出したら、呼び出したDefクラス変数をクラス側が自動で特定して処理させたいのです。

  • yutopapa
  • ベストアンサー率47% (139/295)
回答No.4

Defクラスのobject_null()メソッドからでは、多分考えてらっしゃる事は出来ないと思います。 私ならこう書きます。 import java.applet.Applet; public class Abc extends Applet{ Def de,de2; Def gh; public void init(){ de = new Def(this,1,2); de = de.object_null(this); de2 = new Def(this,1,2); de2 = de2.object_null(this); gh = new Ghi(this,1,2); gh = gh.object_null(this); } } class Def{ int d,e,f; Abc abc; Def(Abc a,int i1,int i2){ //略 } public Def object_null(Abc a){ return null; } } class Ghi extends Def{ Ghi(Abc a,int i1,int i2){ super(a,i1,i2); }

noname#6927
質問者

お礼

レスつけ間違いました。 失礼しました。

noname#6927
質問者

補足

>どのDefクラス変数でも自分のメソッドの中で >自分自身を操作できるようにする方法が知りたいのです。 Def de,de2,de3; とクラス変数があるとして、 de.object_null(); を実行すると、クラス内部でメソッドを呼び出したdeを特定してdeだけが削除されるという意味です。 クラスDef内の記述で、クラス変数の名前や場所を具体的に記述してなくても、 Defクラスメソドを呼び出したら、呼び出したDefクラス変数をクラス側が自動で特定して処理させたいのです。

  • yutopapa
  • ベストアンサー率47% (139/295)
回答No.3

最初の質問を読んでなんとなーく分かってきました。 やっぱり(3)が肝なんですね。 Abcクラスのde,de2,gh変数をnullにしたいのだが (そもそもpublic宣言されてないぞっていう問題はありますが。) Defクラスのメソッドからでは Abc.de = null; としか書けないので、どうしたら良いかって事ですね? そもそもAbcクラスのinit()メソッドが何をやりたいのか よく分からないのですが、 class Abc extends applet{   Def de,de2;   Ghi gh;      public void init(){    de = new Def(this,1,2);    de = null;    de2 = new Def(this,1,2);    de2 = null;    gh = new Ghi(this,1,2);    gh = null;   }  } では、どうしてダメなのですか?

noname#6927
質問者

お礼

nullすることが目的であるとは 一言も書いてないのですが・・・。 理解しにくいとは思いますが、なんとか質問の方を理解していただけませんでしょうか。 よろしくお願いします。

noname#6927
質問者

補足

このコードのinit()が何をしたいかが質問の問題ではありません。 このコードはあくまで"例"です。 もう一度質問を整理してみますね。 クラスAbc内のDefクラス変数deのメソッドde.object_nullに引数thisを渡して、 Def内で"Abc内のDefクラス変数de"と言ったように具体的に指定してクラス変数を操作するのではなく、 引数thisを渡さず、クラス変数を具体的に指定しなくても、 どのDefクラス変数でも自分のメソッドの中で 自分自身を操作できるようにする方法が知りたいのです。

  • yutopapa
  • ベストアンサー率47% (139/295)
回答No.2

ごめんなさい。やっぱり理解出来ません。 これでコンパイル通りますか? 最初の回答の (3)Defクラスのobject_null()メソッドで    abc.de = null;    ってありますが、Abcクラスにdeというpublic変数がないです。 が解決してないと思うんですが。 それにしても、なんかパズルのようなコードですね。(^^;

noname#6927
質問者

補足

コンパイル通ったコードをのせますね。 import java.applet.Applet; public class Abc extends Applet{ Def de,de2; Ghi gh; public void init(){ de = new Def(this,1,2); de.object_null(this); de2 = new Def(this,1,2); de2.object_null(this); gh = new Ghi(this,1,2); gh.object_null(this); } } class Def{ int d,e,f; Abc abc; Def(Abc a,int i1,int i2){ //略 } public void object_null(Abc a){ abc = a; abc.de = null; } } class Ghi extends Def{ Ghi(Abc a,int i1,int i2){ super(a,i1,i2); } }

  • yutopapa
  • ベストアンサー率47% (139/295)
回答No.1

すいません、まず何なのですかこのコードは? Javaは自信があったのですが、何回読んでもよく理解出来ません。 まず突っ込みどころ。 (1)Defクラスのnewとコンストラクタの定義が合ってません。 (2)Defクラスのobject_null()メソッドの引数が呼び出しと、定義とで合ってません。 (3)Defクラスのobject_null()メソッドで    abc.de = null;    ってありますが、Abcクラスにdeというpublic変数がないです。 質問に当たりきっとコードを端折られたのだと思うのですが、ちょっと意図が理解出来ません。 もう一回書き直してもらえますか?

noname#6927
質問者

お礼

更に補足です。 Abcクラスの{が一個余分でした。 ごめんなさい。

noname#6927
質問者

補足

すみません(--; appletのコードでした。 コンストラクタ&メソッドに引数指定してませんでした。 ごめんなさい。 class Abc extends applet{   Def de,de2;   Ghi gh;      public void init(){    de = new Def(this,1,2);    de.object_null(this);    de2 = new Def(this,1,2);    de2.object_null(this);    gh = new Ghi(this,1,2);    gh.object_null(this);   }  } } class Def{  int d,e,f;  Abc abc;  Def(Abc a,int i1,int i2){   //略  }  public void object_null(Abc a){   abc = a;   abc.de = null;  } } class Ghi extends Def{  Ghi(Abc a,int i1,int i2){   super(a,i1,i2);  } }

関連するQ&A