広告

手を動かして学ぶ Java入門 (superキーワード)

環境構築不要! ブラウザから直接コードを実行できます。
本記事では、クラスで使う super キーワードについて学びます。

10分くらいで、さくっと終わる記事をめざしています。


シリーズ一覧

続きは近日公開予定!

はじめに

この記事は paiza.IO の「Online Java compiler」を利用しています。
2025/1/7 現在、上記環境の Java バージョンは 18 です。(paiza.IO利用ガイド)

実行したコードは paiza.IO で保存および公開されることがあります。
そのため、個人情報などの機密性の高い情報は、コードとして入力しないようにご注意ください。

詳細は paiza.IO の利用規約およびプライバシーポリシーをご確認ください。

継承のおさらい

コンピュータプログラミングにおける継承(けいしょう、英: inheritance)とは、任意のオブジェクトの特性を、他のオブジェクトの特性の基礎にするためのメカニズムと定義されている。

クラスの継承とは、簡単にいうと…

  • ベースとなるクラスの フィールドメソッド
  • それを 引き継いだ 新しいクラスを作る (宣言する)

ことです。

ベースとなるクラスのことは「スーパークラス」、継承して作った新しいクラスのことは「サブクラス」といいます。

継承イメージ1

super キーワード

super キーワードとは、簡単にいうと…

  • 「スーパークラス」のメソッドやフィールドにアクセスするための変数

のことです。
(super に対して値の代入はできないので、厳密には変数ではないかもしれません…)

使い方は、前回学習 した this キーワードと似ています。

例えば、次のような Sample クラスと SubSample クラスを考えてみましょう。
SubSample クラスは Sample クラスを 継承して、print メソッドをオーバーライドしています。

public class Sample {
    public void print() {
        System.out.println("スーパークラス!");
    }
}

public class SubSample extends Sample {
    @Override
    public void print() {
        System.out.println("サブクラス!");
    }
}

SubSample クラスを使うには次のようにします。

Sample sample = new SubSample();
sample.print();

それでは、実際にプログラムを動かして確認してみましょう。
コードは変更せずに、そのまま「実行(Ctrl-Enter)」ボタンを押してください。

注意:コードは3ファイルあります。上部のタブで切り替え可能です。

タブ

(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)

いかがでしたでしょうか? 「出力」のところに

サブクラス!

と表示されたら成功です。

ここまでは、前回までの復習ですね。


さて、print メソッドがオーバーライドされていることは分かりました。
オーバーライドされているので、上書きされた「スーパークラス」の print メソッドは呼び出されません。

しかし、print メソッドを呼び出したら、スーパークラスの print メソッドも合わせて呼び出したい。
そんなこともあるかもしれません。

といっても、次のように書くのは NG です。

public class SubSample extends Sample {
    @Override
    public void print() {
        System.out.println("サブクラス!");

        print(); // ★この書き方はNG!
    }
}

これはメソッドの 再帰呼び出し といって、自分自身(SubSample) のメソッドを呼び出し続けてしまいます。

再帰呼び出し

結果として、画面には…

サブクラス!
サブクラス!
サブクラス!
サブクラス!
・
・
・

と延々と表示され続けて、最後には スタックオーバーフロー というエラーになってプログラムが止まります。

メソッドへのアクセス

それでは、先ほどの再帰呼び出しでエラーとなってしまった問題を解決しましょう。

super キーワードを使うと、スーパークラスのメソッドにアクセスすることを 明示 できます。

public class SubSample extends Sample {
    @Override
    public void print() {
        System.out.println("サブクラス!");

        super.print();
        ^^^^^^ <--- ★この部分!
    }
}
  • super + ドット(.) + クラスメソッド

という書き方が基本となります。
このあたりは this キーワードと同じですね。

これで、

super.print();

↑のコードは、スーパークラス(Sample) の print メソッドが呼び出されるようになります。

実際にプログラムを動かして確認してみましょう。
結果がどうなるか予想してから「実行(Ctrl-Enter)」ボタンを押してください。

注意:コードは3ファイルあります。上部のタブで切り替え可能です。

タブ

(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)

いかがでしたでしょうか? 「出力」のところに

サブクラス!
スーパークラス!

と表示されたら成功です。

無事に、スーパークラスのメソッドを明示的に呼び出すことができました。

super キーワードは、特にオーバーライドした「スーパークラス」のメソッドを呼び出したいときに便利です。

フィールドへのアクセス

super キーワードでスーパークラスのフィールドにもアクセスできます。
ただし、あまり必要になることはありません。

というのも、フィールドはアクセス修飾子を private にすることが多いからです。
( private なスーパークラスのフィールドは、super キーワードを使ってもアクセスできません)

そんなこともできるんだ … と頭の片隅にでも置いておけば十分かな、と思います。

【コード例】

public class Sample {
    public int value = 123;
}

public class SubSample extends Sample {
    public int value = 456;

    public void print() {
        System.out.println("super.value = " + super.value);
        System.out.println("value = " + value);
    }
}
SubSample sample = new SubSample();
sample.print();

【結果】

super.value = 123
value = 456

応用問題

【問題】

まずは、下記のプログラムをそのまま「実行(Ctrl-Enter)」してみましょう。
結果として次のように「出力」に表示されたはずです。

サブ : A
サブ : B
サブ : B

そこで問題です。

SubSample クラスに super キーワードを書き加えて、プログラムを実行すると、

サブ : A
サブ : B
スーパー : B

と「出力」に表示されようにしてください。

それでは、SubSample クラスに "super." を書き加えてから「実行(Ctrl-Enter)」してみましょう。
(修正するのは SubSample クラスだけです)

注意:コードは3ファイルあります。上部のタブで切り替え可能です。

タブ

(表示がおかしいときは「コードの再読み込み」ボタンを押してみてください)

無事に、

サブ : A
サブ : B
スーパー : B

と出力されましたでしょうか?

もし解けなかった場合は、下記の回答例をご参照ください。

回答例

【コード】

public class SubSample extends Sample {

    public void printA() {
        System.out.println("サブ : A");

        printB();
        super.printB();
    }

    @Override
    public void printB() {
        System.out.println("サブ : B");
    }
}

※ Main.java, Sample.java は書き換えません。

【出力】

サブ : A
サブ : B
スーパー : B

まとめ

super キーワードとは、簡単にいうと…

  • 「スーパークラス」のメソッドやフィールドにアクセスするための変数

のことです。
オーバーライドしたスーパークラスのメソッドを呼び出したいときに便利です。

ぜひ有効に活用していきたいですね。

それでは次回もお楽しみに!


関連記事

ページの先頭へ