クラスの継承、インターフェース

  1. クラスの継承


    1. 継承

      1. 継承とは
         クラスは、指定したクラスを「継承」すると、そのクラスの変数やメソッドを、特に定義なしに利用することが可能です。継承されたクラスを親クラス、継承したクラスを子クラスと呼びます。

      2. extend
        あるクラスclassBが別のclasAを継承する場合
         class ClassB extends ClassA { ..... }
        と宣言します。
        よく利用されるメソッドを集めて一般的なクラス classA を作成し、それを利用して(専門化)したクラス ClassB を定義するときなどに利用します。Javaでは一つのクラスしか継承できま せん。

      3. アクセス指定子
        アクセス指定子を指定すると継承に制限を加えることができます。accses指定子には、private、指定しない、protected、public、の4種です。

    2. オーバーライド

      1. オーバーライド
        継承したクラスに含まれるメソッドを継承したクラスで定義し直すことが出来ます。これをメソッドのオーバーライドと言います。(同じクラス、同じ名前だが引数や戻りの型が異なるメソッドを定義するのが、オーバーロードです。)

      2. final
        継承したメソッドでは、親のメソッドを書き直すことでオーバーライドできます。これが望ましくない場合、メソッドに final を付加して、オーバーライドを禁止することができます。

    3. 継承とコンストラクタ、superメソッド

      1. 継承したクラスのコンストラクタ
        クラス b が a を継承している場合、b のオブジェクトを生成するとき a のデフォルトのコンストラクタ(引数なし)が最初に呼び出されます。

      2. super()メソッド
        デフォルトでない、引数つきのコンストラクタを呼び出すには、super(引数)メソッドを利用します。super(引数)は明示的に引数に対応する親クラスのコンストラクタを呼び出すメソッドです。

      3. 多態性
        クラス b がクラス a を継承しており、a1,b1 を a,b のオブジェクト、aref を a の参照とします。a,b がメソッドplayを定義している場合、aref.playは、代入されるオブジェクトで異なるメソッドを呼び出すことができます。これを、多態性と呼び ます。aref.playで呼び出すメソッドはコンパイル時には一意でなく、実行時に定まることになります。
         詳細はこちらを参照して下さい。

         aref=a1
         aref.play(); //クラスaのプレイ
         aref=b1;
         aref.play(); //クラスbのプレイ

    4. 抽象クラスとabstract

      1. 抽象クラス
         抽象クラスは抽象度の高いオブジェクトを表現する場合に便利なクラスです。宣言だけを持ち、定義はそれを継承したクラスに任せるメソッドを定義できます。このようなクラスを抽象クラスといいます。

      2. abstract
        定義を持たないメソッドは abstract として宣言します。abstractクラスを継承した場合、メソッドを定義しないとインスタンスにできません。

      3.  Coinクラス
         Coinクラスは硬貨を代表しますが、種類が決定しないと、額が決定しません。そこで、value() メソッドは abstractとし、派生クラスで、額を決定します。
        // 抽象クラス: 硬貨
        class Coin{
            public abstract int value();
          public String material="metal";
        }
        
        // 1円硬貨
        class Coin1 extends Coin{
            public int value(){
                return 1;
            }
        }
        
        // 10円硬貨
        class Coin10 extends Coin{
            public int value(){
                return 10;
            }
        }

    5. interface

      メソッドの宣言や定数のみを集めて interface を宣言することが出来ます。メソッドの作成(インプリメント)を要請する場合、メソッドの形式を統一したり、各種定数を渡すときに便利な機能です。

      1. interfaceの定義
        classの替わりに、キーワードinterfaceで宣言します。型のみを定義するメソッドにはabstractを付記します。

        public interface Rating{
         public abstract int rating();
         ..
        }

      2. implements:インターフェースの利用
        インターフェースを利用するには、implements キーワードを利用します。implements をする場合、interface内部のすべてのメソッドを定義する必要があります。
         Javaでは複数のクラスを継承することはできませんが、複数のinterfaceをimplementsすることは可能です。
        インターフェースの宣言で、extends は可能ですが、implements の宣言はできません。

  2. 定数とメソッドの宣言の束:interface


    1. interface

      メソッドの宣言や定数のみを集めて interface を宣言することが出来ます。メソッドの作成(インプリメント)を要請する場合、メソッドの形式を統一したり、各種定数を渡すときに便利な機能です。
      Javaでは単一のクラスしか extend(継承) できませんが、interface を複数組み込むことができます。

    2. interfaceの定義

      classの替わりに、キーワード interface で宣言します。型のみを定義するメソッドにはabstractを付記します。

      public interface Rating{
       public abstract int rating();
       ..
      }

    3. implements:インターフェースの利用

      インターフェースを利用するには、implements キーワードを利用します。implements をする場合、interface内部のすべてのメソッドを定義する必要があります。