からくりブログ

株式会社からくり社員のブログです

【Java SE Bronze 試験対策④】ポリモーフィズムの問題

こんにちは。
今日はコードに関するポリモーフィズムの問題をやっていきましょう。

問.次のプログラムをコンパイル、実行したときの結果として正しいものを選びなさい。

public class Employee{
   public void disp(){
      System.out.println("Employee");
    }
}
public class Manager extends Employee{
    public void disp(){
      System.out.println("Manager");
   }

   public static void main(String[] args){
       Manager m = new Manager();
       Employee e = m;
       e.disp();
     }
 }

A.「Employee」が表示される
B.「Manager」が表示される
C.「Employee」「Manager」の順に表示される
D.「Manager」「Employee」の順に表示される
E.コンパイルエラーになる
F.実行時に例外がスローされる

———————この先答え—————————

答.B

インスタンスを抽象化して共通の型で扱うことをオブジェクト指向では「ポリモーフィズム」と呼びます。
どのような型でインスタンスに扱ったとしても動作するのはインスタンス(実装)そのものです。

もしポリモーフィズムの問題が出題されたら変数の型に注目するのではなく、どのインスタンスを生成したかを確認するのがポイントです。

この問題ではEmployeeクラスを継承して、Managerクラスを定義しています。
そのためポリモーフィズムを使えばManagerのインスタンスはEmployee型で扱うことが可能になります。

Managerクラスの7行目ではManagerクラスのインスタンスを生成しています。
その後8行目でEmployee型の変数eにManagerのインスタンスへの参照を代入しています。
このようにManagerのインスタンスをEmployee型で扱ったとしても、実際に動作するのはManagerインスタンスです。
よってMainクラスの9行目で呼び出されているdispメソッドが実装されます。答えはBになります。

もし選択肢Dのように「Manager」「Employee」と表示させたかった場合はsuperを使ってスーパークラスのメソッドを呼び出せば表示されます。

public void disp(){
    super.disp();
    System.out.println("Manager");
 }

今回は難しく見えますが理屈を1度覚えてしまえば簡単だと私は感じます。
その分自分が納得いくまで理解を深めるのがいいかもしれませんね。

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>