オーバーライド

クラスを継承した場合にサブクラス(子クラス)内でスーパークラス(親クラス)で定義したメソッドを 定義することができます。

具体的にはスーパークラスと同じ名前のメソッドをサブクラスでもつけれます。

このことをオーバーライドといいます。

オーバーライドのルール

定義のルールとしては、必ずメソッド名 戻り値の型、引数の数と型がスーパークラスの
メソッドと同じにしなければいけません。

オーバーライドされたメソッドは何も定義されていなければサブクラスのメソッドが
優先的に呼び出されます。

オーバーライドの例

 
     class Super{ 
   void method() { 

          処理1;
      }
        class Sub extends Super{ 

             void method() { 

         処理2;
      } 

上記例はSuperクラスとSubクラスは継承関係にあります。
ともにmethod()メソッドを定義しています。戻り値もvoidです。これがオーバーライドです。

しかしここで重要なことがあります。

もしここでmethod()メソッドを呼び出したときどちらが先に呼び出されるのでしょうか?
最初のオーバーライドのルールでも記述していますがこの場合はサブクラスのメソッドが呼び出されます。

もしスーパークラスのmethod()メソッドを呼び出したい時はキーワードsuperで呼び出せます。

では、サンプルプログラムで確認したいと思います。

サンプルプログラム(Sample49.java)

class Sample49{
    public static void main(String args[]){

    Sub49 obj = new Sub49();
    obj.method(); 
    }
}

class Super49{
     void method(){
          System.out.println("これはスーパークラスのメソッドです");
    }
}

class Sub49 extends Super49{

      void method(){
            System.out.println("これはサブクラスのメソッドです");

} }

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

マルチドメイン対応、ビジネス仕様 高性能レンタルサーバー 【シックスコア】
店舗向けホームページ作成サービス「グーペ」


コンパイル・実行してみます。

このようにSuper49クラスとSub49クラスにはそれぞれ void method() を定義しています。
つまり、オーバーライドされているわけです。
それをmainメソッドで呼び出しています。

しかし出力結果を見てわかるように呼び出されているのはサブクラスのメソッドです。 オーバーライドされたメソッドは優先的にサブクラスのメソッドが呼び出されます。

サンプルプログラム(Sample49_1.java)

オーバーライドとオーバーロードを使用したサンプル

class Sample49_1{
    public static void main(String args[]){

     Sub49_1 obj = new Sub49_1();

       obj.method();
       obj.method("Yamada");
} } class Super49_1{ void method(){ System.out.println("Hello"); } } class Sub49_1 extends Super49_1{ void method(){ System.out.println("おはよう"); } void method(String str){ System.out.println("私の名前は " + str + " です"); } }
プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行してみます。

このようにSub49_1ではスーパーークラスのSuper49_1のmethod()メソッドをオーバーライドしています。
またSub49_1内では引数なしのmethod()と String 型の引数を持っているmethod(String str)を定義していて
これはオーバーロードになります。
mainメソッドで引数なしのmethod()メソッドと引数有りのmethod("Yamada")を呼び出しています。

では、次のプログラムを見ていきましょう。

サンプルプログラム(Sample49_2.java)

class Sample49_2{
    public static void main(String args[]){

     Sub49_2 obj = new Sub49_2();


       obj.method();
       obj.method("Yamada");
} } class Super49_2{ void method(){ System.out.println("Hello"); } void method(String str){ System.out.println("私の名前は " + str + " です"); } } class Sub49_2 extends Super49_2{ void method(){ System.out.println("おはよう"); } }

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

【PR】ホームページで広告収入をゲット!A8.net


コンパイル・実行してみます。

今回はスーパークラスで引数の無いmethod()と引数を持つmethod(String str)を定義しています。
サブクラスでは引数の無いmethod()だけ定義しています。
スーパークラスにもサブクラスにも引数の無いメソッドが有ります。もちろんサブクラスのメソッドが優先的に呼ばれますが、method(String str)はどうでしょうか? サブクラスには定義されていないのでこの場合はスーパークラスのmethod(String str)が呼び出されています。

次のサンプルプログラムを見てください。

サンプルプログラム(Sample49_3.java)

class Sample49_3{
    public static void main(String args[]){

     Sub49_3 obj = new Sub49_3();

       obj.method();
       obj.method("Yamada");
} } class Super49_3{ void method(){ System.out.println("Hello"); } void method(String str){ System.out.println("私の名前は " + str + " です"); } } class Sub49_3 extends Super49_3{ void method(){ System.out.println("おはよう"); } void method(String str){ System.out.println("僕の名前は " + str + " です"); } }

プログラムをコピーする場合すべて選択をクリックしてください。

Sponsored link

コンパイル・実行してみます。

今度はコンパイル実行に成功しました。
Super49_3もSub49_3もメソッドをmethod() と method(String str)を定義しています。
ともにオーバーロードしていることになります。
実行結果を見てください。

おはよう 僕の名前は Yamada です になっています。

少しわかりにくいけど私の名前が 僕の名前になっています。
つまりサブクラスのほうのメソッドが呼ばれていることもここでわかりますね

ページのトップへ戻る