スーパークラスとは
「スーバークラス」とは、継承関係にあるクラスの継承元のクラスのことを指します。また、継承先の子クラスのことは「サブクラス」と呼びます。
Java ではクラスの継承をするとき、クラス名の横に extends スーバークラス名 で指定します。
具体的な例を見てみましょう。
次のサンプルコードは3つのクラスの内「クラスB」は「クラスA」を継承し、「クラスC」は「クラスB」を継承する例です。
class ClassA {
ClassA () {
System.out.println("ClassAです");
}
}
class ClassB extends ClassA {
ClassB () {
System.out.println("Classす");
}
}
class ClassC extends ClassB {
ClassC () {
System.out.println("ClassCです");
}
}
上の例のとき「クラスB」からすると「クラスA」がスーパークラスとなり、「クラスC」からすると、「クラスB」と「クラスA」がスーパークラスになります。
このように、スーパークラスと呼ばれるのは、継承階層上で上位のクラスになっているクラスのことを指します。
super キーワード
スーパークラスを継承したサブクラスでは、親のクラスのメソッドやフィールド変数などに super キーワードを使ってアクセスできます。
通常、別のクラスのメソッドや変数にアクセスする場合は、そのオブジェクトのスコープを public にしないとアクセスできませんが、継承関係にあるクラスの場合は、 protected および public スコープのオブジェクトにサブクラスからアクセスすることが可能です。
// スーパークラス
class ClassA {
ClassA () {
}
public int field1;
protected int field2;
private int field3;
public void sampleMethod1 () {
System.out.println("sampleMethod1");
}
protected void sampleMethod2 () {
System.out.println("sampleMethod2");
}
private void sampleMethod3 () {
System.out.println("sampleMethod3");
}
}
// サブクラス
class ClassB extends ClassA {
ClassB () {
}
public void run() {
super.sampleMethod1();
super.sampleMethod2();
//super.sampleMethod3(); ← スーパークラスの private メソッドは参照できない
System.out.println("field1=" + String.valueOf(super.field1));
System.out.println("field2=" + String.valueOf(super.field2));
//↓スーパークラスの private フィールドは参照できない
//System.out.println("field3=" + String.valueOf(super.field3));
}
}
スーパークラスのコンストラクタ呼び出し
サブクラスを new でインスタンスを生成するとき、自動でスーパークラスのコンストラクタが呼び出されます。
class ClassA {
ClassA () {
System.out.println("ClassAのコンストラクタ");
}
}
class ClassB extends ClassA {
ClassB () {
System.out.println("ClassBのコンストラクタ");
}
}
class Main {
public static void main(String[] args) throws Exception {
ClassB classB = new ClassB();
}
}
▪️実行結果
ClassAのコンストラクタ
ClassBのコンストラクタ
また、スーパークラスにコンストラクタが複数存在する場合は、引数なしのデフォルトコンストラクタが呼ばれます。
class ClassA {
ClassA () {
System.out.println("ClassAのコンストラクタ(引数なし)");
}
ClassA (String args) {
System.out.println("ClassAのコンストラクタ(引数あり)");
}
}
class ClassB extends ClassA {
ClassB () {
System.out.println("ClassBのコンストラクタ");
}
}
class Main {
public static void main(String[] args) throws Exception {
ClassB classB = new ClassB();
}
}
▪️実行結果
ClassAのコンストラクタ(引数なし)
ClassBのコンストラクタ
スーパークラスに引数なしのコンストラクタが存在しない時は、サブクラスで明示的にスーパークラスのコンストラクタの呼び出しを指定しないと、コンパイルエラーになります。
class ClassA {
ClassA (String args) {
System.out.println("ClassAのコンストラクタ(引数あり)");
}
}
class ClassB extends ClassA {
ClassB () {
System.out.println("ClassBのコンストラクタ");
}
}
class Main {
public static void main(String[] args) throws Exception {
ClassB classB = new ClassB();
}
}
上のコードの場合、次のコンパイルエラーが発生する。
error: constructor ClassA in class ClassA cannot be applied to given types;
こういったケースでは、サブクラスのコンストラクタで明示的にスーパークラスのコンストラクタを呼び出します。
class ClassB extends ClassA {
ClassB () {
super(“sample”); //スーパークラスのコンストラクタを呼び出し
System.out.println("ClassBのコンストラクタ");
}
}
まとめ
Java のスーパークラスについての解説と、スーパークラスとサブクラスのコントラクタの呼び出し関係について解説してきました。
Java はオブジェクト指向言語であり、クラスの継承は Java の開発者として必須の知識です。クラスの継承をマスターして Java 開発者としてステップアップしましょう。
スーパークラスのコンストラクタは継承できません。これは、サブクラスのインスタンスからスーパークラスのコンストラクタが呼び出せてしまうと、サブクラスのコンストラクタが呼ばれず、初期化されない可能性があるため禁止されています。