• ベストアンサー

子インスタンスを登録するメソッドの作成

Java初心者です。 学習中に躓いてしまったので、ご教示いただければと思います。 Testという1つのクラスを作成し、 そこから複数のインスタンスを作成します。 Test test1 = new Test(); Test test2 = new Test(); Test test3 = new Test(); 元のTestクラスの中に、 public void addSub(Test child) という、引数に指定したインスタンスを子に登録するメソッドを用意します。 実際に使うときは、 test1.addSub(test2); とすれば、test1の子にtest2が登録されるようにしたいのです。 基本的にサブクラスにするには、クラスを作る段階でextendsを用いるイメージなので、同じクラスの別インスタンスを親子関係にする、というのがよく分かりません。 このプログラムの目的は、最終的に一番親となったインスタンス(test1)の合計メソッドを呼び出して、自分の子供に登録されているインスタンス(test2,test3)全ての値を合算するということです。 質問の方法が曖昧で分かりにくいと思いますが、 指示いただければ追記いたしますので、 お時間のある方お力を貸していただければと思います。 宜しくお願いします。

  • Java
  • 回答数4
  • ありがとう数3

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

  • ベストアンサー
回答No.3

>public void addTest(Test child){ >this.child = child; >} >これは、test1(元インスタンス)=test2(引数のほう)にするということ>でしょうか。 test1のメンバ変数にtest2を設定しています。 >少し違っていて、 >test1.addTestでよびだしたとして、 >test1の子(サブインスタンス?)にchild(=test2など)としたいと思っ>ています。 すいません。ここ全然意味が理解できないです・・・ >そして、本来の目的は >最後にtest1.totalという風に呼び出したときに、 >testクラスにある、 >public int total(){ >test1の子インスタンス(addTestで引数に指定した全てのインスタン>ス)のscoreを全て足す >} >ということをしたいと思っています。 では public class TestMain { public static void main(String[] args){ Test test1 = new Test(1); Test test2 = new Test(2); Test test3 = new Test(3); test1.addTest(test2); test1.addTest(test3); System.out.println(test1.total()); } } class Test{ Test(int score){ this.score = score; } public int score; public List<Test> childList = new ArrayList<Test>(); public void addTest(Test child){ this.childList.add(child); } public int total(){ int result = this.score; for(Test child : this.childList){ result += child.score; } return result; } } それではこういうこと?

その他の回答 (3)

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.4

 #2です。  ちょっと、コードが間違ってました。 public void addTest(Test child) {   if (this.child == null) {     this.child = child;   } else {     this.child.addTest(child);     ↑ここ変更。   } }  メソッドの引数とインスタンス変数の名前を同じにするとややこしくなっちゃいますね。

  • PecoPlus
  • ベストアンサー率76% (144/188)
回答No.2

 こんにちは。 >少し違っていて、 >test1.addTestでよびだしたとして、 >test1の子(サブインスタンス?)にchild(=test2など)としたいと思っています。  ここは、#1さんの方法で間違っていませんよ。  これで、ちゃんと test1 の変数 child に test2 のインスタンスが登録されます。  ただ、もし、数珠つなぎにするという仕様であっているのなら、addTestメソッドは、 public void addTest(Test child) {   if (this.child == null) {     this.child = child;   } else {     child.addTest(child);   } }  この方が、簡単に数珠つなぎになるんじゃないですか。  あと、totalメソッドですが、ごく単純に、 public int total(){   int result = num;   if (child != null) {     result += child.total();   }   return result; }  これで、再帰的にそれぞれのインスタンスが自分の子のトータルを呼び出して、万事うまくいくと思いますよ。

sakurangel
質問者

お礼

回答ありがとうございます。 すみません、#1さんのが正しかったんですね。 初心者すぎてちゃんと理解できていませんでした。 御指摘ありがとうございました。 #1さん、すみませんでした。 そうです、やりたかったことは数珠繋ぎです。 (そのような言葉はまったく浮かんでいませんでした。。。) 再帰処理を用いればいいんですね! 頭がだいぶすっきりしました。 整理してやってみます! 本当にありがとうございました<(_ _)>

回答No.1

public class TestMain { public static void main(String[] args){ Test test1 = new Test(1); Test test2 = new Test(2); Test test3 = new Test(3); test2.addTest(test3); test1.addTest(test2); System.out.println(test1.num + test1.child.num + test1.child.child.num); } } class Test{ Test(int num){ this.num = num; } public int num; public Test child; public void addTest(Test child){ this.child = child; } } こういうかんじのことがしたいんですか?

sakurangel
質問者

補足

回答ありがとうございます。 public void addTest(Test child){ this.child = child; } これは、test1(元インスタンス)=test2(引数のほう)にするということでしょうか。 少し違っていて、 test1.addTestでよびだしたとして、 test1の子(サブインスタンス?)にchild(=test2など)としたいと思っています。 そして、本来の目的は 最後にtest1.totalという風に呼び出したときに、 testクラスにある、 public int total(){ test1の子インスタンス(addTestで引数に指定した全てのインスタンス)のscoreを全て足す } ということをしたいと思っています。 (自動的に子インスタンス全てを呼んでくる、という方法があるのか、という疑問もあるのですが) これで説明になっていますでしょうか・・・ 何分初心者で言葉の意味が曖昧なところがあるので伝わりにくくてすみません。

関連するQ&A

  • インスタンス化されているかの情報を 知るメソッド

    VisualStudioC#で Aというクラスがあり、それを B,Cというクラスでインスタンスで使用したとします。 A: { ?????? } B: { A a = new A(); } C: { A a = new A(); } Aクラスの中の処理でB,Cのどちらでインスタンス化されているのかという情報を 知るメソッドはあるのでしょうか? ちなみにインスタンス化するときにAに引数などを送り込まないこととします。

  • クラス変数/メソッドとインスタンス変数/メソッドの見え方について

    Javaの言語仕様(?)についてお教え下さい。 参照変数の型がインスタンスのスーパークラスの型の時、クラス変数/メソッドとインスタンス変数/メソッドの見え方が納得いかずに困っています。 以下のような条件の時です。   ・クラスが2つあり、1つはもう1つのクラスを継承しています。     それぞれを「スーパー」「サブ」と以下で呼びます。   ・インスタンスは"サブ"の型です。   ・上記インスタンスへの参照変数は"スーパー"のクラスの型です。   ・"スーパー"、"サブ"ともに【同名】の「クラス」変数/メソッド、「インスタンス」変数/メソッドがあります。 この場合に、"サブ"のインスタンスを参照している"スーパー"の型の変数を介し、それらにアクセスしたらどれが見えるか?という疑問です。 実験結果では以下のようになりました。           [フィールド]  [メソッド]   [1.static ]  スーパーの   スーパーの   [2.非static]  スーパーの   サブの 納得いかないのは「2.非static」で「フィールド」が、「スーパーの」になるところです。 これも「サブの」になると思っていました。 なぜサブクラスのが見えないのでしょうか? 同名の変数なのでスーパークラスのはサブクラスので隠れされ、サブクラスのが見えると思っていたのですが。 参考書には以下のように書いてありました。   フィールドの場合、参照変数の型のものが見える。   メソッドの場合、インスタンスの型のものが見える。 私には不自然に感じられるのですが、「こういう仕様だから。」と納得するしか無いのでしょうか? 「なぜこうなるか」について説明がある文献、サイトなどありましたらお教えください。 参考までに以下が実験したサンプルコードと結果です。長くて申し訳ありません。 「サンプルコード」 public class Super { static int staticField = 10; int instanceField = 100; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class Sub extends Super { static int staticField = 90; int instanceField = 900; static void staticMethod() { System.out.println( "staticField = " + staticField ); } void instanceMethod() { System.out.println( "instanceField = " + instanceField ); } } public class TestStatic { public static void main(String[] args) { // インスタンスはSub、参照変数もSub、という状態。 Sub sub = new Sub(); System.out.println( "実験1" ); System.out.println( "1.クラス変数      " + sub.staticField ); System.out.print( "2.クラスメソッド    " ); sub.staticMethod(); System.out.println( "3.インスタンス変数   " + sub.instanceField ); System.out.print( "4.インスタンスメソッド " ); sub.instanceMethod(); // インスタンスはSub、参照変数はSuper、という状態。 Super sup = new Sub(); System.out.println( "実験2" ); System.out.println( "5.クラス変数      " + sup.staticField ); System.out.print( "6.クラスメソッド    " ); sup.staticMethod(); System.out.println( "7.インスタンス変数   " + sup.instanceField ); System.out.print( "8.インスタンスメソッド " ); sup.instanceMethod(); } } 「結果」 実験1 1.クラス変数      90 2.クラスメソッド    staticField = 90 3.インスタンス変数   900 4.インスタンスメソッド instanceField = 900 実験2 5.クラス変数      10 6.クラスメソッド    staticField = 10 7.インスタンス変数   100 8.インスタンスメソッド instanceField = 900 納得が行かないのは7のところです。 以上よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Java 静的メソッドとインスタンスメソッド

    静的メソッドとインスタンスメソッドの使い分けがよくわかりません。 私の認識は 静的メソッド:インスタンスメンバ変数を参照する必要がない処理 インスタンスメソッド:インスタンスメンバ変数を参照して行う処理 と思っています。 よって、例えばDAOを作成する場合、select、update、insertを実行するメソッドを作成しますが、これらはクラスのインスタンスメンバ変数を参照する必要がないので静的メソッドにするべきだと思っています。 しかし、本やネットのDAOのサンプルプログラムはインスタンスメソッドで作成されています。 これらは、private static String の変数(SQL文が記述されている)を参照していますが、インスタンスメンバ変数は参照していません。 なぜselect、update、insertのメソッドをインスタンスメソッドにする必要があるのかわかりません。 静的メソッドとインスタンスメソッドの使い分けの基準を教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Java
  • super( )メソッドについて質問です

    サブクラスのコンストラクタの定義をするときにsuper()メソッドを使うときはどういうときですか?また、どうしてsuper()メソッドを使って、スーパークラスのインスタンスを作成しないといけないのですか?教えてください。

    • ベストアンサー
    • Java
  • Ruby 特異メソッドのnewが先に実行?

    Rubyのインスタンス生成について質問があります。 通常クラスを定義する場合は class Hoge ; def hello(); pirnt "hello"; end であると思います。 ただ Hoge = Class.new(); でもクラスは定義できるとききました。 ただこの場合Hogeクラスに定義できるのは HogeというClassクラスから作られた特異クラスとしてのHogeに 特異メソッドのみを定義できるということですよね? 通常のインスタンスメソッドは定義できませんよね? ではでは、 hoge = Class.new(); とした場合はどうなるのでしょうか? この場合は Classクラスの純粋なインスタンスとなるのでしょうか? 前者の定義とおなじ仕方ですが代入先が、通常の変数です。 この場合は、クラスオブジェクトとして生成されるのですか? オンラインマニュアルをみたところ 「新しく名前の付いていない superclass のサブクラスを生成します。 superclass が省略された時にはObject のサブクラスを生成します。 名前のないクラスは、最初に名前を求める際に代入されている定数名を検索し、見つかった定数名をクラス名とします。」 とあります。 上記内容は Classクラスの特異クラスとして定義されている特異メソッド(new)です。 これは Class.new()で作られたインスタンスを代入する先が定数であればその定数名と同じクラスを定義しつつそのClassクラスのクラスオブジェクトを生成するという意味合いでまちがいないでしょうか? 上記のとおりであれば hoge =Class.new()の場合は、やはりhogeというクラスを定義することになるのでしょうか? クラス定義は定数でなければならないはずですよね。 ただ実際、 p hoge;として出力すると#とひょうじされています。これはhogeがクラスオブジェクトではなく ただのインスタンスであるということでしょうか? であるならばこの hoge = Class.new()の式のnewはClassクラスオブジェクトに定義された特異メソッドではなく Classクラスに定義されたnewメソッド・・・・・つまりClassクラスに定義されたインスタンスメソッドの方のnewメソッドだとおもうのですが・・・・・・。 つまりこちらのメソッドですね。 「new( ... ) クラスのインスタンスを生成して返します。このメソッドの引数はブロック引数も含め initialize に渡されます。」 ※オンラインリファレンスから参照しました。 しかし 通常メソッドの検索は特異メソッドからはじまりその後クラスのインスタンスメソッド->親クラスのメソッドと 検索して行くとあります。 必ず先に、特異メソッドを実行しているはずだと思うのですが・・・。 やはり特異メソッドnewを実行しているのでしょうか? 長々すみませんが、ご教授ください。

    • ベストアンサー
    • Ruby
  • クラス、インスタンスメソッドについて

    JAVA初心者です。 現在、先人が作ったプログラムの修正作業を行っておりますが、 以下の点に疑問があります。(因みに、先人はJAVAのスペシャリストではありません。) あるクラスが以下の様になっております。 public class Sample { private static Sample s = new Sample(); private Sample() { } /** クラスメンバに存在するインスタンス取得 * @return Sampleクラスの唯一のインスタンス */ public static Sample getInstance(){ return s; } public static void methodA(){ ... } } でこのmethodAを使用するには、以下の様にします。 Sample.getInstance().methodA() これはこれで納得で、うまく動作しますが、これは 結局の所、クラスメソッドにしたかったという事ではないのかな?と 疑問に感じています。つまり、単純に Sample.methodA と呼び出せばうまくいきます。 ところが、たまたまAPIドキュメントを見ていた所、Calendarクラスにもやはり getInstanceというものが存在し、現在日時を取得するのに Calendar.getInstance().getTime() の様に呼び出すと書いてありました。 Sampleクラス、JAVAのCalendarクラス(これに限った事では無いとは思いますが) のこれらのgetInstanceの効用とはなんなんでしょうか? ・クラスの外でnewでインスタンスを作り出さない所 ・それでいてクラスメソッドではない(?)所 この辺りについてご回答よろしくお願いします。

    • ベストアンサー
    • Java
  • 型が未決定な状態でのインスタンス化

    ジェネリックプログラミングで <T extends > クラス宣言 xxx としたときに、 DIコンテナからロードしたクラスを、 メンバー変数 T にインスタンス化したいです。 しかし、 T test = new T() と 書くことはできず、困っています。 実装する方法をご存じの方がいらっしゃいましたら教えて頂けませんでしょうか? ****************** create メソッドを実装しておくとか、newinstance メソッドを使うとかなのでしょうか?

    • ベストアンサー
    • Java
  • JAVAインスタンス作成 クラスを2回書くのはなぜ

    インスタンス作成の際 Computer myComp = new Computer(); クラス 変数 = new クラス (引数) このようにクラス名を左右2度書くのはなぜですか? 何か理由があるのでしょうか。

    • ベストアンサー
    • Java
  • 継承について(長文です)

    いつもお世話になっています。現在、継承についての練習問題を解いているのですがわからないことがあるので質問させていただきます。 問題は、「自己紹介メソッド(抽象メソッド)を持つIntroduceクラスを作成し、そのクラスを継承してFistsNameクラス、FullNameクラス、IncludeAgeクラスを作成しなさい。三つのサブクラスのインスタンスを混合して配列に保持し自己紹介をしなさい」というものです。 それぞれのクラスはコマンドライン引数で名字(引数一つ)だけ、フルネーム(引数二つ)、フルネームと年齢(引数三つ)と3種類の引数を入力することによって適切なメソッドが呼び出されるということです。(わかりにくい文章ですいません。例えばヤマダと入力すればFirstNameクラスの自己紹介メソッドが呼び出されてヤマダと表示させたいのです)引数をサブクラスに渡さないと行けませんが、まずコンストラクタで引数をサブクラスに渡す場合は引数を一つ(もしくは二つ)しか指定しなかったときはフルネームとフルネーム+年齢のクラスでコンパイルエラー(ArrayIndexOutOfBoundsException)が出ます(これは理解することが出来ます)次にメソッドで渡す場合はシグネチャが異なるのでオーバーライドされずこちらもコンパイルエラーとなります。この他に引数をサブクラスに渡す方法はあるのでしょうか? わかりにくい文章になってしまいましたが、要するに三つのサブクラスをインスタンス化しその後、引数の個数により適切なサブクラスのメソッドが呼び出され引数を連結して表示させたいのです。このようなことは実現できないのでしょうか?if節によって引数の個数で場合分けなどをしないといけないのでしょうか?質問文がわかりにくければ補足させていただきます。よろしくお願いします。

    • ベストアンサー
    • Java
  • スーパークラスからサブクラスのメソッドを使おうとする、以下のプログラム

    スーパークラスからサブクラスのメソッドを使おうとする、以下のプログラムでつまずいています。 Aを継承したB、Cクラスのインスタンスを作成し、スーパークラスであるA型の配列asにまとめます。 それからループでas[i]にはいっている各インスタンスのメソッドを使いたいのですが、 スーパークラスAにmethod()がないためコンパイルできません、Aにmethod()を作るとA.method()が実行されます。 BとCを同じ配列に保存し、かつそれぞれのmethod()を実行したい場合どのようにしたら良いのでしょうか。 ご教授ください、どうぞよろしくお願いします。 class Main{ private B b; private C c; private A[] as = new A[2]; void mainMethod(){ as[0] = b = new B(); as[1] = c = new C(); for(int i=0; i<3; i++){ as[i].method(); } } } class A{} class B extends A{ void method(){ System.out.print("It is B"); } } class C extends A{ void method(){ System.out.print("It is C"); } }

専門家に質問してみよう