Java 速習チュートリアル

Java super キーワード

1. Java - super キーワードとは?

Javaにおける super キーワードは、サブクラスからその親クラス(スーパークラス)を参照するために使用される参照変数です。

super キーワードの最も一般的な用途は、親クラスとサブクラスで同じ名前のメソッドや属性(フィールド)が存在する場合に、その混同を避けて明示的に親側のメンバーを指定することです。

主に以下の2つの目的で使用されます:

  • 親クラスの属性やメソッドへのアクセス
  • 親クラスのコンストラクタの呼び出し

1.1 親クラスのメソッドへのアクセス

サブクラスに親クラスと同名のメソッドがある場合(オーバーライド)、super を使うことで親側のメソッドを呼び出すことができます。

例:

class Animal {
  public void animalSound() {
    System.out.println("動物が音を出します");
  }
}

class Dog extends Animal {
  public void animalSound() {
    super.animalSound(); // 親クラスのメソッドを呼び出し
    System.out.println("イヌが鳴きます:バウワウ");
  }
}

public class Main {
  public static void main(String[] args) {
    Dog myDog = new Dog();
    myDog.animalSound();
  }
}

出力結果:

動物が音を出します
イヌが鳴きます:バウワウ

       注記: サブクラスでオーバーライド(上書き)したメソッドの中から、あえて親クラスの元の処理を実行したい場合に super を利用します。

2. 親クラスの属性へのアクセス

親クラスとサブクラスで同じ名前の属性(フィールド)を持っている場合も、super を使って親クラスの属性にアクセスできます。

例:

class Animal {
  String type = "動物";
}

class Dog extends Animal {
  String type = "イヌ";

  public void printType() {
    System.out.println(super.type); // 親クラスの属性にアクセス
  }
}

public class Main {
  public static void main(String[] args) {
    Dog myDog = new Dog();
    myDog.printType();
  }
}

出力結果:

動物

3. 親クラスのコンストラクタの呼び出し

super() を使用すると、親クラスのコンストラクタを呼び出すことができます。これは、共通の初期化ロジックを再利用する場合に非常に便利です。

例:

class Animal {
  Animal() {
    System.out.println("Animalが作成されました");
  }
}

class Dog extends Animal {
  Dog() {
    super(); // 親クラスのコンストラクタを呼び出し
    System.out.println("Dogが作成されました");
  }
}

public class Main {
  public static void main(String[] args) {
    Dog myDog = new Dog();
  }
}

出力結果:

Animalが作成されました
Dogが作成されました

       注記:super() の呼び出しは、サブクラスのコンストラクタ内において、必ず最初のステートメント(最初の行)でなければなりません。これを守らないとコンパイルエラーが発生します。