• ベストアンサー

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

高橋麻奈著の「やさしい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を指定してしまいます。 クラス側から自分自身のクラス変数を指定する良い方法を教えてください。 よろしくお願いします。 #ここは半角スペース無効なんですね(^^;

noname#6927
noname#6927
  • Java
  • 回答数6
  • ありがとう数7

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

  • ベストアンサー
  • 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

  • 違うクラスからの変数の共有化

    一つのクラスの中にある変数の値を、二つの別なクラスから呼び出して、その二つのクラスのどちらから変数を参照しても同じ値が帰ってくるようにしたいのですが、いろいろ調べてもできなかったので質問させていただきますm(_ _)m // 共有化させたい変数を持つクラス // Var.java public class Var{  public static int i;  public Var(int i){ this.i = i; }  public Var(){}  public static void getI(){   return i;  } } //クラス1 //Class1.java public class Class1{  Var var = new Var(1); } //クラス2 //Class2.java public class Class2{  Var var = new Var();  System.out.println(var.getI()); } とした場合、Class1を実行し、次にClass2を実行すると、クラス1で定義した変数の値である 1 が戻ってくるようにしたいのですが、上記の方法では、Class2を実行すると結果は 0 になってしまいました。 まだまだ習い始めたばかりでいまいちstaticを使い切れていないと思います・・・ たとえば、PrintStreamクラスの public static final PrintStream out というのはどこから参照しても同じ結果なのでそのようなやり方で大丈夫だろうと思ったのですが・・・ このような方法では共有化させることはできないのでしょうか?またできないのでしたらほかのやり方がもしあった場合は教えていただきたいと思います。 どうかお願いします。

    • ベストアンサー
    • Java
  • javaの配列とクラス

    abstract class abstract_class{ } class subclassA extends abstract_class{ int num = 1; } class subclassB extends abstract_class{ int num = 2; } class subclassC extends abstract_class{ int num = 3; } class Main{ public static void main(String args[]){ int sum = 0; abstract_class var[] = new abstract_class[3]; var[0] = new subclassA(); var[1] = new subclassB(); var[2] = new subclassC(); for(int i=0;i<3;i++) sum += var[i].num; System.out.println(sum); } } これをコンパイルすると Main.java:23: シンボルを見つけられません。 シンボル: 変数 num 場所 : abstract_class の クラス for(int i=0;i<3;i++) sum += var[i].num; ^ エラー 1 個 というエラーが出るのはなぜでしょうか? var[i]はみなsubclassA,subclassB,subclassCが代入されているのに、numはabstract_classの変数となっています。 よくわかりません。 よろしくお願いします。

    • ベストアンサー
    • Java
  • クラスメソッドのみのクラスのオブジェクト生成は不可??

    あるテキストのjavaの問題です。 public class Draw{   static void pixel(int x,int y){     /*座標(x、y)に点を描画*/   }   static void line(int x1,int y1,int x2,int y2){     /*座標(x1、y1)~(x2、y2)に線を引く*/   } } で、これを実行するための以下のようなクラス public class TestDraw{ <ここに入力> } という問題なのですが2つまでは絞れたのですが、 (1) public static void main(String args[]){   Draw d = new Draw().line(10,10,20,30); } ↑× (2) public static void main(String args[]){   Draw.line(10,10,20,30); } ↑○ (2)はlineメソッドがstaticメソッドだからオブジェクト生成しなくても良い、ということなんですが (1)も正解のような気がするのですが・・・ 解説によると「lineはvoidなのでnew Draw().line(10,10,20,30);とすれば正解、とあります。 どうもいまいち理解できません。 クラスメソッドはオブジェクト生成しなくとも良い→オブジェクト生成できない ということなのでしょうか? それからちなみに、public classって2つ記述できないんではありませんでしたか?

    • ベストアンサー
    • Java
  • クラス作成

    C#にてクラス作成をしております。その中で疑問に思った点を質問させていただきます。 画像を枠内に表示させるクラス 実装すべき変数:枠番号、パス、 映像を枠内に流すクラス 実装すべき変数:枠番号、パス、再生時間 Flashを枠内に流すクラス 実装すべき変数:枠番号、パス など色々なクラスがあってそれをまとめたクラスを作成中です。 上記のクラスを実装するにあたって、共通の変数はクラスにしてしまい それを継承しましょうと言う指示がありました。これはどういった使い方をするものなのでしょうか? class Class2 { public int no { get; set; } public string path { get; set; } } class Movie : Class2 {    public float time{get;set;} public void Play(int frameNo, string path, float playtime){} } class Picture: Class2 {    public void Show(int frameNo, string path){} } これをForm1.cs内で Class2 cls = new Class2(); cls.path = "C:\\test"; cls.no = 11; とかすれば MovieやPictureで使いまわしができると思いきや MovieやPictureをNewすれば初期化されてしまう為、何か根本的に 私の考えが間違ってると思います。 共通の変数を別のクラスにしておいて継承して使うというのはどういった使い方をするのでしょうか? よろしければ例で教えていただけないでしょうか

  • 整数値を任意のオブジェクトを格納できるスタッククラスに格納する方法

    class ObjStack { private Object[] mBuf; private int mSP; public ObjStack(int size) { mSP = 0; mBuf = new Object[size]; } public int getSize() { return mBuf.length; } public int getNum() { return mSP; } public boolean isFull() { return mSP == mBuf.length; } public boolean isEmpty() { return mSP == 0; } public void push(Object x) { if (!isFull()) { mBuf[mSP++] = x; } } public Object top() { Object obj = null; if (!isEmpty()) { obj = mBuf[mSP-1]; } return obj; } public Object pop() { Object obj = null; if (!isEmpty()) { obj = mBuf[--mSP]; } return obj; } } 上のプログラムは任意のオブジェクトを格納できるスタッククラスです。 int型の値はオブジェクトではないので、このObjyStackクラスに格納することができない。 整数値をこのObjStackクラスに格納する方法を教えて下さい。

    • ベストアンサー
    • Java
  • 現在のクラスを生成したクラスに渡したい

    親クラスで生成した子クラス(ダイアログ)から親クラス(ダイアログ)の関数などを使えるようにしたいと思っております。 ちなみに継承クラスで親クラスの関数を使うのではなく、親クラスそのもの(ダイアログ表示)を子クラスから変更できるようにしたいです。 (簡単になりますが…)プログラムの構成は以下のようになっており、thisポインタを渡すか所でエラーが起こってしまいます。 ------------------------------------------------ class AAA { BBB *b; void classBBB{ b = new BBB(this); // こういうことがしたいが、できない void fun( int a ); // ダイアログの表示が変更する(予定) }; class BBB { AAA *a; BBB(AAA *pDlg){ a==pDlg; } void fun(){ int b; a->fun(b); } // 親クラスの関数を呼び出したい }; ------------------------------------------------ ただし、class Aとclass Bを生成する上位階層のプログラム構築をすることはなしとします。 ------------------------------------------------ こんな感じ AAA *a = new AAA(); BBB *b = new BBB(a); ------------------------------------------------ どうしてもclass AAAからclass BBB呼び出したいと思ってます。 何か良い解決法があれば、教えていただきたいです。 宜しくお願い致します。

  • C#クラスについて教えてください

    下記通りクラスを作成した場合、プロパティaを配列にできますか? class Class1 { public string a { set; get; } public int b { set; get; } public int c { set; get; } } イメージとしては下記通りにしたいのですが、なかなかうまく行きません。 class Class1 { public Class1(int x) { } public string a[x] { set; get; } public int b { set; get; } public int c { set; get; } } private void Form1_Load(object sender, EventArgs e) { Class1 f = new Class1(2); f.a[0] = "asdf"; f.a[1] = "asdfa"; f.a[2] = "asdfasd"; f.b = 1; f.c = 2; } 初心者なんで、やさしく教えてください。お願いします。

  • フィールドを持たないクラスが、値を保持できる理由

    なぜint型フィールドを持たないMyGenericsクラスが変数やリテラルを保持できるのでしょうか? Objectクラスのフィールドを持っていますが、Objectクラスも、 フィールドは持っていませんよね?メソッドも空のObject()しか持っていないですし。 一応、javadocを読んだのですが、読み方間違えていますか? http://dlc-cdn.sun.com/jdk/jdk-api-localizations/jdk-api-ja/builds/latest/html/ja/api/index.html --------------------code-------------------------------- public class MyGenericsTest { public static void main(String[] args) { int x = 234; MyGenerics g = new MyGenerics(x); Integer i = (Integer)g.get(); System.out.println(i); } } class MyGenerics { Object o; public MyGenerics(Object o){ this.o = o; } public Object get(){ return o; } }

    • ベストアンサー
    • Java
  • 内部クラス?のエラー

    内部クラス?のエラー  今晩は、JAVA初心者です、宜しくお願い致します。  下のようなプログラムを書いてやりました。  <A>のように全体のプログラムを1つのクラスの中に別のクラスを入れる(内部クラス?)と、 「アクセス可能な型Testのエンクロージング・インスタンスがありません。  型Testのエンクロージング・インスタンスで割り振りを限定する必要があります。  (例えばx.new A()でxはテストのインスタンス)」というエラーがでます。  しかし、<B>のように別のクラスにすると、エラーは出ません。  この原因がよくわかりません。 ==================================================================== <A> public class Test { public static void main(String args[]) { Calc ca = new Calc(); ca.calcTest(1,2); } class Calc { void calcTest(int a , int b ) { int c = a + b ; System.out.print("a + b = " + c); } } } ==================================================================== <B> public class Test { public static void main(String args[]) { Calc ca = new Calc(); ca.calcTest(1,2); } } class Calc { void calcTest(int a , int b ) { int c = a + b ; System.out.print("a + b = " + c); } } ====================================================================

    • ベストアンサー
    • Java
  • C++ クラス概念

    以下の違いがよく理解できていません。 どなたかご教授お願い致します。 (1)クラスのメンバー変数に static を付けた場合と、 メンバーではない変数に static を付けた場合の違い (2)クラスのメンバー関数に static を付けた場合と、 メンバーではない関数に static を付けた場合の違い [プログラム例] class MyClass { public: static int internalCount; static void func(MyClass& a) {/* ... */} }; static int i; static void f(MyClass& a) { /* ... */ }

専門家に質問してみよう