• 締切済み

親クラスから子クラスへアクセス。

親クラスから子クラスへアクセス。 お世話になります。 以下のプログラムについて考えています。 public class Main{  public static void main(String[] args) {   SubA subA = new SubA();   SubB subB = new SubB();   Super[] subs = {subA,subB};   subs[1].method();   subs[2].method();  } } class Super{  String str = "親";  public void method(){   System.out.println(str);  } } class SubA extends Super{  String str = "子A"; } class SubB extends Super{  String str = "子B"; } この場合、出力結果は当然 親 親 になります。 これを子クラスの str を表示するようにしたいのです。つまり 子A 子B です。 ただし、子クラスで method() をオーバーライドしたり、super.str = "子A" のように親クラスを書きかえずにです。 子クラスが何百種類もある場合、全く同じmethod()を書く無駄や、変更があったときにそれを全てを修正しなければならないことを避けたいのです。 何か良案がありましたら、ぜひご教授ください。よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数9

みんなの回答

  • vaguechat
  • ベストアンサー率85% (47/55)
回答No.2

Super#method()の System.out.println(str); を try { System.out.println(getClass().getDeclaredField("str").get(this)); } catch (Exception e) { e.printStackTrace(); } に。

momomoStar
質問者

お礼

このイメージです、ありがとうございます。 これはリフレクションというやつでしょうか・・・ まったく無知だったので機能にかなり衝撃を受けました。 勉強したいと思います、ありがとうございました。

  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

とりあえず。 記載のソースの実行結果は例外で落ちますね。 本題。これではだめですか? class Super {   //String str = "親";   public void method() {     //System.out.println(str);     System.out.println(getStr());   }   protected String getStr() {     return "親";   } } class SubA extends Super {   //String str = "子A";   @Override   protected String getStr() {     return "子A";   } } class SubB extends Super {   //String str = "子B";   @Override   protected String getStr() {     return "子B";   } } フィールドを定義しているならメソッドに変えてもそんなに手間は変わらないかなと。

momomoStar
質問者

お礼

エラーすみません、凡ミスでした; うーん、手間はやはりかわらなそうですね。 しかし変更時に修正箇所を減らす点ではかなり有効だと思います。 ありがとうございました。

関連するQ&A

  • 親クラスと子クラスのフィールドとメソッドについて

    親クラスと子クラスのフィールドとメソッドについて 以下のサンプルソースを実行した時の動作の原理について 教えてください。 oya型変数にkoクラスのインスタンスを作成した場合、 メソッドはkoクラスのものなのに、 フィールドはoyaクラスのものになるということが イマイチすっきり理解できません。 どういうことなんでしょうか。 ------------------------------------------------------- [ソース] public class exec { public static void main( String args[]){ oya obj = new ko(); System.out.println(obj.str_field); obj.disp_field(); } } public class oya{ String str_field="親実行"; public void disp_field(){ System.out.println(str_field); } } public class ko extends oya { String str_field = "子実行"; public void disp_field(){ System.out.println(str_field); } } ------------------------------------------------------- [実行結果] > 親実行 > 子実行 -------------------------------------------------------

    • ベストアンサー
    • Java
  • 親クラスの初期化についてご教授ください

    javaの勉強を始めた者です。質問させてください。 以下のようなコードの、 親クラスの初期化をしている部分の挙動が、 うまく理解できません。 class p{ public int i = 3; public void foo(){}; } class c extends p{ public int i = 0; public void foo(){ System.out.print("foo "); } } public class b{ public static void main(String[] s){ p bar = new c(); // ←ここです bar.foo(); System.out.print(bar.i); } } 実行結果は「foo 3」です。 以下の点が理解できません。 ・なぜメソッドは子クラスのものが実行されるのに、プロパティは親クラスのものが表示されるのか? ・子クラスのコンストラクタを利用することで、いったいどのような挙動となるのか? オブジェクト指向の基礎を理解しれません・・・よろしくお願いします。

    • ベストアンサー
    • Java
  • Javaのプログラムについて至急教えてください!

    //Sub.java class Super{ public void A(){} } class Sub extends Super{ /* (1) */ } このプログラムの(1)に入るものを下から2つ選んで他のクラスのメインメソッドから呼び出すのですがどうやってもわかりません。わかる方教えてください! public void A(){} public String A(){ return "pool";} public int A(String str){return Integer.parseInt(st);} public int A(){return 3;} public Object A(){return new Object();}

    • ベストアンサー
    • Java
  • Exceptionクラスの継承について

    Exceptionクラスを継承しているExceptionMがありますが、その中にsuper(message)というものがあります。 これは、スーパークラスのExceptionがmessageという変数を引数で受けることができるメソッドを使用していることは分かりますが、実際何を行っているのでしょうか? そして、この処理によって何を得ているのでしょうか? あと、try{のなかにtry{という変な記述していますが、問題でそうかかれていただけなので気にしないでください。 問題箇所 class ExceptionM extends Exception{ public ExceptionM(String message){ super(message); } } 全ソース class ExceptionSubclassQuestion{ public static void main(String args[]){ a(); } static void a(){ try{ try{ throw new ExceptionM("M"); }catch(ExceptionN e){ System.out.println("lnner catch"); e.printStackTrace(); } }catch(ExceptionM e){ System.out.println("Quter catch"); e.printStackTrace(); } } } class ExceptionM extends Exception{ public ExceptionM(String message){ super(message); } } class ExceptionN extends ExceptionM{ public ExceptionN(String message){ super(message); } }

    • ベストアンサー
    • Java
  • あれ?

    すいません。 長い間、 疑問に思ってたことがあるんですけれども、 (1) import javax.swing.*; class Sample {  public static void main (String args[])  {   ........   Aメソッド()  } } (2) import javax.swing.*; class Sample extends aiueo {   public static void main (String args[])  {   ........   Aメソッド()  } } (3) class Sample extends aiueo {  public static void main (String args[])  {    ........   Aメソッド()  } } の違いが、 考えれば考えるほどわからなくなってきました。 パッケージと継承の関係について、 どうやら理解できていないみたいです。 どなたか分かりやすく教えてください。 よろしくお願いします。 (注) Aメソッドはaiueoクラスのメソッドとし、 aiueoクラスはjavax.swingパッケージに入っているものとします。

    • ベストアンサー
    • Java
  • クラス名を変えるとコンパイルが通らない

    interface HINA { void write(String str, int age); } class super_class { String name; int age; public void write(String str, int age){ System.out.println(str + "\t" + age); } super_class(String name, int age) { this.name = name; this.age = age; } } class sub_class extends super_class implements HINA { public void write(String str , int age) { System.out.println(str + "\t" + age); } sub_class(String str , int age) { super(str , age); } } public class test3 { public static void main(String[] args) { super_class naru = new super_class("成瀬川なる", 17); super_class shinobu = new sub_class("前原しのぶ", 13); sub_class motoko = new sub_class("青山素子", 15); if (naru instanceof HINA) naru.write(naru.name, naru.age); if (shinobu instanceof HINA) shinobu.write(shinobu.name, shinobu.age); if (motoko instanceof HINA) motoko.write(motoko.name, motoko.age); } } これのsuper_classをOyaに、sub_classをKoにするとコンパイルエラーになります。 何故なんでしょう。 分かる方がいましたら、教えて下さい。 どうぞ宜しくお願い致します。 それと見づらくてどうもすいません。

    • ベストアンサー
    • Java
  • 抽象クラスからオーバーライドについて

    EclipseでJavaを勉強始めました。 抽象クラスからオーバーライドするところで質問致します。 抽象クラスとして、「面積を計算する」というメソッドをもつDiagramクラスを定義しました。それを継承して、「四角形の面積を計算する」というメソッドをもつSquareクラスと、「三角形の面積を計算する」というメソッドをもつTriangleクラスを定義しました。 Squareクラス、Triangleクラスからインスタンスを生成して、四角形、三角形の面積をコンソールに表示させるという簡単なプログラムです。 このとき、main関数と3つのクラスの関係についてお尋ねします。 (1)iagram.java、Square.java、Triangle.javaそれぞれにクラス定義とmain関数を持たせるパターン public abstract class Diagram { // 面積計算定義(抽象メソッド) public static void main(String[] args) { } } public class Square extends Diagram{ //四角形の面積の計算定義 public static void main(String[] args) { //四角形の面積の計算と表示 } public class Triangle extends Diagram{ //三角形の面積の計算定義 public static void main(String[] args) { //三角形の面積の計算と表示 } (2)sample.javaというファイルにまとめ、その中にこの3つのクラス定義とmain関数を一つ持たせるパターン public class sample { public static void main(String[] args) { //四角形の面積の計算と表示 //三角形の面積の計算と表示 } } abstract class Diagram { // 面積計算(抽象メソッド)定義 } class Square extends Diagram{ //四角形の面積の計算定義 } class Trapezoid extends Diagram{ //三角形の面積の計算定義 } この二通りを考えて、どちらも実行できたのですが、どちらの方がJavaらしいプログラムと思われますでしょうか?

    • ベストアンサー
    • Java
  • メソッドの引数にクラス配列を指定した場合…?

    問題のソースの構造を簡略化して書きます。 class superA { } class subB extends superA { } class mainC { public static void main(String[] abc) { /* superAとsubBをインスタンス化して 利用。int変数に値を入れている。 */ } } class questionD { public static int EEE(superA[] FFF) { } } クラスmainCまではなんの問題もなく理解もできますし、ちゃんと動くのですが、問題はクラスquestionDで 指定されている上のメソッド(int EEE(superA[] FFF))でmainCで代入されたsuperAやsubBの変数の値を使って、その和を返せ というものなんですが まず引数にクラス配列を指定してる場合、どのようにしてmainCで呼び出せばいいのでしょうか? また、どのようにしてquestionDでsuperAやsubBのint変数を利用すればいいのでしょうか? 教えてください。よろしくお願いします。 まだjavaをはじめて間もないので間違った言葉の使い方や意味の不明な点がありましたら補足要求でお願いします。

    • ベストアンサー
    • Java
  • 親クラスの型で子のオブジェクトを扱う

    ●下記のコードについての質問となります class Y { int num2 = 20; } class Z extends Y { int num3 = 30; } class Sample{ public static void main(String args[]){ --------------------------------------------- Y y1 = new Z(); --------------------------------------------- System.out.println(y1.num2); System.out.println(y1.num3); } } 「-----」で囲まれている部分になりますが、 親クラスの型で子のオブジェクトを扱おうと思うのですが、 「System.out.println(y1.num3);」 この部分において、コンパイルエラーとなります。 Zクラスから生成されたオブジェクトへの参照を Y型変数y1に代入していると思うのですが、 何故、「y1.num3」の値が表示されないのかを ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ お伺いしたいと思っております。 以上、宜しくお願い致します。

    • ベストアンサー
    • Java
  • 抽象クラス について

    obj.write();した時 class super1 の write()が呼ばれ その後 class HINA の write()が呼ばるのか? 直接 class HINA の write()が呼ばるのか? どう呼び出してるのか 教えてください abstract class super1 { abstract void write(); } class HINA extends super1{ void write() { System.out.println( "LOVE HINA" ); } } class test { public static void main( String args[] ) { super1 obj = new HINA(); obj.write(); } } }

専門家に質問してみよう