• ベストアンサー

親の親のメソッドを呼ぶには?

最近VC++をはじめていじって、 思った疑問です。 class A class B extends A class C extends C 各クラスはメソッドaaa()を持ってたとします。 Aのaaa()はsysout("A.aaa") Bのaaa()はsysout("B.aaa") (sysout = System.out.println) ってなっている場合 CのaaaでAのような振る舞いを見せることは可能なんでしょうか。 C++だと親子関係をすっとばして親の親(おじいちゃん?)のメソッドを呼べるようです。 javaだとsuper.aaa()みたいな書き方しかできないと おもうのですが、 親の親のメソッドを呼ぶってできるのでしょうか?

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

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

  • ベストアンサー
  • osumitan
  • ベストアンサー率33% (102/307)
回答No.3

Javaではsuperにsuperを重ねることはできません。 親のクラスがおじいちゃんのクラスのメソッドを オーバーライドしていないのであれば、 もちろんsuper.xxx();で呼べるでしょうが、 親のクラスがおじいちゃんのクラスのメソッドを オーバーライドしているということは、 おじいちゃんのクラスのメソッドではなく、 自分のクラスのメソッドを使ってほしい、 ということであると思います。 おじいちゃんのクラスのメソッドを呼べるとしたら、 親のクラスのメソッドの中で、super.xxx();を 呼んでいるなら、間接的に呼べるのでしょうけど。 つまり、おじいちゃんのメソッドを呼ぶということは 親のクラスの意向に従っていないことになるわけで、 必要ならおじいちゃんを継承するべきです。

chi-kon
質問者

お礼

>親のクラスの意向に従っていないことになるわけで、 なんかここ文章で納得してしまいました。 ありがとうございます。

その他の回答 (3)

  • kakusuke
  • ベストアンサー率36% (95/259)
回答No.4

staticメソッドなら、 キャストして呼べませんか?

chi-kon
質問者

お礼

クラスメソッドだったら。。。 という問題なので。 ありがとうございます!

  • syakko
  • ベストアンサー率25% (6/24)
回答No.2

適当な回答ばかりですみませんが、 継承関係を変更することは不可能ですか?C extends Aとか。 または、Aを直接呼び出すことがないのであればinterfaceにしちゃうとか。

chi-kon
質問者

お礼

ありがとうございます。 特に実務で必要になったわけじゃなくて、 おやをすっとばしておじいちゃんを 呼べるかどうかを知りたかったのです。 実務で必要になれば、 アドバイスいただいたような方向で 解決しなくてはいけないかもしれませんね!

  • syakko
  • ベストアンサー率25% (6/24)
回答No.1

やったことないのでわかりませんが・・・ super.super.aaa() ってやっぱできないでしょうか?

chi-kon
質問者

お礼

早速の回答ありがとうございます。 やってみちゃいましたが、 コンパイルエラーになるようです。 eclipseでやってみたんですけど、 なんかもんくいってました!あやつ。

関連するQ&A

  • メソッドのオーバーライド(java)

    class A3{ void hello(){ System.out.println("A3"); } void hello(int i){ System.out.println("A3"+i); } } class B3 extends A3{ void hello(){ System.out.println("B3"); } } class C3 extends B3{ void hello(String s){ System.out.println("C3"+s); } } class MethodOverriding3{ public static void main(String args[]){ A3 obj = new C3(); obj.hello(); } } 上のプログラムを実行すると"B3"と表示されまが、どうしてクラスBのメソッドが実行されるのでしょうか? クラスAのメソッドが無視される仕組みがわかりません。 また、クラスMethodOverriding3でobj.hello("abc")としてコンパイルすると mo.java:25: シンボルを見つけられません。 シンボル: メソッド hello(java.lang.String) 場所 : A3 の クラス obj.hello("abc");   ^ エラー 1 個 とエラーが出ます。 どうしてでしょうか? 誰か教えてください、お願いします。

    • ベストアンサー
    • Java
  • オブジェクトの関連について

    クラスAAAとクラスBBBをインスタンス化し、それぞれ、aとbのオブジェクトとします。 mainメソッドから、bのbmethメソッドを呼び出し、さらに、Amethメソッドを呼び出し また、mainからもaのAmethメソッドを呼び出し可能にする方法はありませんでしょうか? まだ、Java初心者なもので説明も不十分かと思いますがよろしくお願いします。 class AAA{ void Ameth() { System.out.println("Aメソッド"); } } class BBB{ public AAA a; void bmeth(){ a.Ameth(); } } public class test{ public static void main(String arg[]) { AAA a = new AAA(); BBB b = new BBB(); b.bmeth(); a.Ameth(); } }

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

    スーパークラスからサブクラスのメソッドを使おうとする、以下のプログラムでつまずいています。 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"); } }

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

    親クラスから子クラスへアクセス。 お世話になります。 以下のプログラムについて考えています。 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のコンストラクタについて教えてください

    Javaを勉強している初心者です。 次のようなプログラムがあります。 このプログラムでclass aおよびclass bのデフォルトコンストラクタ a() {}とb() {}をコーディングしていないとコンパイルエラーになります。 b() {}についてはclass bのパラメータのあるコンストラクタb(String s)がサブクラスclass cから明示的に呼ばれていないのでデフォルトコンストラクタb() {}をコーディングしないとエラーになる…と考えればよいのでしょうか。 それでは、a() {}はなぜ必要なのでしょうか。 どなたか教えてください。 class a { a() {} a(String s) { System.out.println("In a's constructor..."); System.out.println(s); } } class b extends a { b() {} b(String s) { super(s); System.out.println("In b's constructor..."); System.out.println(s); } } class c extends b { c(String s) { System.out.println("In c's constructor..."); System.out.println(s); } public void some() { System.out.println("something..."); } } public class appJ01 { public static void main(String args[]) { c obj = new c("Hello from Java!"); } } 

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

    親クラスと子クラスのフィールドとメソッドについて 以下のサンプルソースを実行した時の動作の原理について 教えてください。 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で、オブジェクトを生成しないとメソッドは使えないんですか?

    javaで、オブジェクトを生成しないとメソッドは使えないんですか? そのように習ったのですが、サブクラスのメソッド定義の中で、オブジェクトを生成せずにスーパークラスのメソッドを使える例(下に簡単に書きました)をみて、分からなくなってしまいました。 おしえてください、よろしくおねがいします。 ------------------------------- class superclass { method_a(){ ~~~~ } } --------------------------- class subclass { method_b(){ super.method_a(); }

    • ベストアンサー
    • Java
  • クラスの継承、メソッドのオーバーライド

    ↓の問題が全然わかりません。 問題:サブクラスのsiki2にax2+bx+c=0(b2-4ac>0)とコンストラクタ を定義して、スーパークラスのsiki1にax+b=0とコンストラクタを定義し、解を求めるkaiメソッドを定義する という問題です。途中のプログラムを↓に書きました。 スーパークラス class houteisiki1{ private int kai; private int a; private int b; private int x; //コンストラクタ houteisiki1(int s, int d, int e, int f){ solve=s; a=d; b=e; x=f; } //kaiメソッド kai=(a*x)+b; } サブクラス class houteisiki2 extends houteisiki1{ static int kai(int a, int b, int c, int x){ kai=(a*x*x)+(b*x)+c; if((b*b)+(-4*a*c)>0){ return kai; }else{ println("エラー"); } } } テストクラス class test{ public static void main(string[] args){ ここまで作りましたが、解らなくなりましたので教えてください。 まだ、JAVAを勉強して日が浅いので解りやすく教えてください。

    • ベストアンサー
    • Java
  • 動的に変数をセット後他クラスから参照する場合

    コンストラクタで変数にセットした後 他のクラスでインスタンスを生成することなく セットした変数を参照したいのですが、 staticにすると、他クラスで変数を変更することも できてしまいます。他の方法がありますでしょうか? 変数はprivateにして、getterで取得するという方法も 考えられますが、static finalな変数として扱う方法が あるか、お分かりの方いらっしゃいましたら教えてください。 Javaを初めて1ヶ月なので、見当違いの質問でしたらご指摘ください。 例) Class A{  static final String aaa; A(String paraStr){ aaa = paraStr; } } Class B{ static void main(String[] args){ new A("test"); } } Class C{ void chStr(){ System.out.println(A.aaa); A.aaa = "changeStr" System.out.println(A.aaa); } } 期待する値 test test もしくは、実行時にfinalの値は変更できない等のException 宜しくお願いします。

    • ベストアンサー
    • Java
  • java:サブクラスメソッドを呼び出したいです。

    java のプログラムで抽象クラスをオーバーライドしたサブクラスのメソッドをスーパークラスで呼び出したいのですが、どうしてもコンパイルが通りません。また通ったとしてもコマンドプロンプト画面で、 c:\File>javac UseSam.java c:\File>java UseSam 5 6 c:\File> となってしまい(この問題で求められている回答)5+6の結果 11 が返ってきません。 c:\File>java UseSam a a c:\File>型が違います c:\File>java UseSam 3 4 5 c:\File>引数の個数が不正です 上記のように打つとエラーメッセージだけは返ってきます。 つたない文章とはなってしまいましたが、ご教授のほどよろしくお願いいたします。 プログラムは下記のとおりとなります。(問題点などの指摘などしていただけたらありがたいです) 抽象クラスAbsSamは抽象メソッドadd含んでいる。 抽象メソッドaddは整数を返すメソッドで、整数型の引数aとbをとる。 abstract class AbsSam {     public abstract int add(int a, int b); } Samでは、抽象メソッドaddを実装し、addは引数a,bの和を返す。 public class Sam extends AbsSam {     public int add(int a,int b) {     return a + b ;     } } mainメソッドを含むUseSam。 プログラム実行時、引数として2つの整数を渡します。 c:\File>java UseSam 5 6 c:\File>11 と計算結果が返ってくる。 (条件) ・引数が2個でない場合、エラーメッセージを返す。 ・引数が数値でない場合、エラーメッセージを返す。 ・正しい引数が与えられた場合、addメソッドを実行し、addメソッドの続行結果を表示して終了とする。 public class UseSample { public static void main( String[] args ) { try { //引数が2個でない場合 if(args.length != 2){ System.out.println("エラーメッセージ:引数の個数が不正です"); //引数が2個の場合 } else if (args.length == 2) { int a = Integer.parseInt( args[0] ); int b = Integer.parseInt( args[1] ); AbsSam sum = new Sam(); sum.a = a; sum.b = b; System.out.println ("計算結果" + sum.add()); } else { System.out.println("エラー"); } //例外処理 } catch(NumberFormatException e) { System.out.println("エラーメッセージ:引数の型が不正です" ); } catch(Exception e) { System.out.println("エラー"); } } } 抽象クラスとサブクラスは問題ないのですが、UseSamがうまく動作しません。 ご教授のほどよろしく願いいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう