Java - クラスの継承

クラスの継承

クラスの継承とは、既存のクラスから新しいクラスにメンバ変数やメンバメソッドを引き継ぐことです。継承されるクラスをスーパークラス(親クラス)、継承したクラスをサブクラスと言います。

例えば、Calculator クラスにはコンストラクタとアクセス修飾子の基本的なメソッドが備わっているとします。

class Calculator{
  private int num;
  
  Calculator(){
    num = 0;
  }
  
  public void setNum(int n){
    num = n;
  }
  
  public int getNum(){
    return num;
  }
}
クラスの継承

Calculator クラスを利用して他のクラスを設計する場合、上記の基本的な機能は重複してしまいます。基本的な機能を共通的にまとめたクラスを作成し、異なる機能だけ追加で設計すると効率的です。

上記の Calculator クラスをスーパークラスとして、クラスの継承を行うには以下のように記述します。

class CalculatorSub extends Calculator{
}
クラスの継承

クラスの継承を行うには extends の後に継承したいスーパークラス名を記述します。ただし、クラスの継承は、一度にひとつしか指定できません。

CalculatorSub クラスは、スーパークラスである Calculator で定義されたメンバ変数やメンバメソッドにアクセスすることができます。下記のサンプルコードでは、CalculatorSub クラスには何も定義していないにも関わらず、スーパークラスのメンバ変数やメンバメソッドを利用できていることが確認できます。

class CalculatorTest{
  public static void main(String args[]){
    CalculatorSub calc = new CalculatorSub();
    
    calc.setNum(10);
    int num = calc.getNum();
    System.out.println(num); // 10
    
  }
}

class Calculator{
  private int num;
  
  Calculator(){
    num = 0;
  }
  
  public void setNum(int n){
    num = n;
  }
  
  public int getNum(){
    return num;
  }
}

class CalculatorSub extends Calculator{

}
クラスの継承

また、サブクラスにコンストラクタが定義されていない場合は、自動的にスーパークラスのコンストラクタが呼び出されます。CalculatorSub クラスは何も定義されていませんが、実際は以下のような挙動をします。

class CalculatorSub extends Calculator{
  super();
}
クラスの継承

super() は、スーパークラスのコンストラクタを呼び出す動作です。コンストラクタを定義しない場合、このようなデフォルトコンストラクタが呼び出されます。また、デフォルトコンストラクタは、引数がないコンストラクタになります。

引数のあるコンストラクタの場合、明示的にコンストラクタを記述しなければなりません。

class Calculator{
  private int num;
  
  /* 引数なしのコンストラクタ */
  Calculator(){
    num = 0;
  }
  
  /* 引数ありのコンストラクタ */
  Calculator(int n){
    num = n;
  }
}

class CalculatorSub extends Calculator{
  /* 引数ありのコンストラクタを明示的に呼び出す */
  super(10);
}
クラスの継承

スーパークラスで定義されているメソッドの処理は、継承したサブクラスでオーバーライド(上書き)することができます。メソッドのオーバーライドを行うには、スーパークラスで定義されている同じメソッド名と、同じ引数を指定しなければなりません。

class Calculator{
  private int num;
  
  Calculator(){
    num = 0;
  }
  
  public void setNum(int n){
    num = n;
  }
  
  public int getNum(){
    return num;
  }
}

class CalculatorSub extends Calculator{
  
  /* getNum メソッドをオーバーライド */
  public int getNum(){
    return 100;
  }
  
}
クラスの継承

サブクラスでは、メソッドの定義を独自に変更したい場合もあります。そのような場合に、同じメソッド名と、同じ引数を使って再定義することで、クラスに合わせた内容に変更することができます。

関連記事