<<5.継承の目次
オーバーライド(上書き)
問題6(難易度:2)                                 2005年5月23日
 次のA、B二つのクラスがある。クラスBの(*)に一つだけメソッドを指定する。下の中から
指定できるメソッドを選べ。

   public class A {
           double a;
           public double methodA(int x) {
                   return a + x; 
           }
   }
   public class B extends A {
     (*)  
   }


 A. public double methodA() {
              return 0.5;
        }
  
 B.  public double methodA(int p) {
               return p * a;
       }
        
 C.  public int methodA(int x) {
               return x * x; 
       }
        
  D. private double methodA(int a) {
               return a * 0.5;
       }
        
  E.  protected double methodA(int p, double q) {
                return p * q * a;
        }
        
解説
 選択肢のメソッド名はすべてスーパークラスAのメソッドと同じmethodAなので、ここはオーバーライド(上書き)かオーバーロードを考えなければならないですね。
 まずAは戻り値の型はdoubleで同じですが、引数部分がちがいます。よってメソッドのシグネチャが異なることになり、オーバーロードでOK。methodAを引数なしで呼ばれればクラスBの、int型の引数一つで呼ばれればクラスAのmethodAが使われることになります。
 次はB。引数はint型一個で完全にシグネチャは一致し、戻り値の型も一致するのでオーバーライドになります。クラスAのmethodAがこれで上書きされることになります。
 Cはシグネチャは一致するのでオーバーロードにはなりません。また戻り値の型が異なるので、オーバーライドもできません。コンパイルエラーになります。
 Dはシグネチャも戻り値の型も一致するのでオーバーライドできるかというと、アクセス修飾子がpublicからprivateに狭まっているので、やはりコンパイルエラーになります。
 Eはシグネチャが異なるのでオーバーロードできることになり、OKです。

解答
A B E

参考 第19章 オーバーロードとオーバーライド
問題7(難易度:2)                                2005年5月27日
次のA、B二つのクラスがある。クラスBのmainを実行すると結果はどうなるか。下から選べ。

   1: public class A {
      2:    int x = 3;
      3:    protected int method(int p) {
      4:          return p + x;
      5:    }
   6: }

   1: public class B extends A {
      2:    public int method(int q) {
      3:          return x * q;
      4:    }
      5:    public static void main(String[] args) {
      6:          A a = new A();
      7:          B b = new B();
      8:          System.out.println(a.method(5) + " " + b.method(5));
      9:    }
  10: }


 A.クラスBの2行目でコンパイルエラーになるため実行できない。
 B.クラスBの8行目でコンパイルエラーになるため実行できない。
 C.8 8 と出力される。
 D.8 15 と出力される。
 E.15 15 と出力される。
解説
 クラスAのメソッドmethodと、クラスBのmethodは、引数の並び、戻り値の型ともに同じなので、前者を後者が上書き(オーバーライド)していることになります。(仮引数名はpとqでちがいますが、これは本質的な違いではありません。)アクセス修飾子は、前者が「protected」、後者が「public」なので、狭くなっていないので問題ありません。
 さて出力を見ましょう。最初の「a.method(5)」は、変数aのクラスはAなので、クラスAのmethodが呼ばれます。よって5+3の8が出力されます。次の「b.method()」は、変数bのクラスがBなので、クラスBで上書きしたmethodが呼ばれます。よって5×3の15が出力されます。

解答
D

参考 第14章
<<5.継承の目次
Copyright (c) 2004-2005 Nagi Imai All Rights Reserved..