手を動かして学ぶ Java入門 (superキーワード)
環境構築不要! ブラウザから直接コードを実行できます。
本記事では、クラスで使う super キーワードについて学びます。
10分くらいで、さくっと終わる記事をめざしています。
シリーズ一覧
- シリーズ
- 手を動かして学ぶ Java入門 (Hello world 編)
- 手を動かして学ぶ Java入門 (数値と演算)
- 手を動かして学ぶ Java入門 (数値と変数)
- 手を動かして学ぶ Java入門 (コメントの書き方)
- 手を動かして学ぶ Java入門 (文と式の違い)
- 手を動かして学ぶ Java入門 (if文)
- 手を動かして学ぶ Java入門 (if-else文、if-elseif文)
- 手を動かして学ぶ Java入門 (文字列の連結)
- 手を動かして学ぶ Java入門 (while文)
- 手を動かして学ぶ Java入門 (break文)
- 手を動かして学ぶ Java入門 (continue文)
- 手を動かして学ぶ Java入門 (for文)
- 手を動かして学ぶ Java入門 (クラスの超基本)
- 手を動かして学ぶ Java入門 (クラス・メソッド)
- 手を動かして学ぶ Java入門 (クラス・フィールド)
- 手を動かして学ぶ Java入門 (クラス・コンストラクタ)
- 手を動かして学ぶ Java入門 (文字列クラス)
- 手を動かして学ぶ Java入門 (静的メソッド)
- 手を動かして学ぶ Java入門 (静的フィールド)
- 手を動かして学ぶ Java入門 (定数の定義)
- 手を動かして学ぶ Java入門 (クラス継承の超基本)
- 手を動かして学ぶ Java入門 (メソッドのオーバーライド)
- 手を動かして学ぶ Java入門 (メソッドのオーバーロード)
- 手を動かして学ぶ Java入門 (thisキーワード)
- 手を動かして学ぶ Java入門 (superキーワード)
続きは近日公開予定!
はじめに
この記事は paiza.IO の「Online Java compiler」を利用しています。
2025/1/7 現在、上記環境の Java バージョンは 18 です。(paiza.IO利用ガイド)
実行したコードは paiza.IO で保存および公開されることがあります。
そのため、個人情報などの機密性の高い情報は、コードとして入力しないようにご注意ください。
詳細は paiza.IO の利用規約およびプライバシーポリシーをご確認ください。
継承のおさらい
クラスの継承とは、簡単にいうと…
- ベースとなるクラスの フィールド と メソッド
- それを 引き継いだ 新しいクラスを作る (宣言する)
ことです。
ベースとなるクラスのことは「スーパークラス」、継承して作った新しいクラスのことは「サブクラス」といいます。
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 キーワードとは、簡単にいうと…
- 「スーパークラス」のメソッドやフィールドにアクセスするための変数
のことです。
オーバーライドしたスーパークラスのメソッドを呼び出したいときに便利です。
ぜひ有効に活用していきたいですね。
それでは次回もお楽しみに!
関連記事
- シリーズ
- 手を動かして学ぶ Java入門 (Hello world 編)
- 手を動かして学ぶ Java入門 (数値と演算)
- 手を動かして学ぶ Java入門 (数値と変数)
- 手を動かして学ぶ Java入門 (コメントの書き方)
- 手を動かして学ぶ Java入門 (文と式の違い)
- 手を動かして学ぶ Java入門 (if文)
- 手を動かして学ぶ Java入門 (if-else文、if-elseif文)
- 手を動かして学ぶ Java入門 (文字列の連結)
- 手を動かして学ぶ Java入門 (while文)
- 手を動かして学ぶ Java入門 (break文)
- 手を動かして学ぶ Java入門 (continue文)
- 手を動かして学ぶ Java入門 (for文)
- 手を動かして学ぶ Java入門 (クラスの超基本)
- 手を動かして学ぶ Java入門 (クラス・メソッド)
- 手を動かして学ぶ Java入門 (クラス・フィールド)
- 手を動かして学ぶ Java入門 (クラス・コンストラクタ)
- 手を動かして学ぶ Java入門 (文字列クラス)
- 手を動かして学ぶ Java入門 (静的メソッド)
- 手を動かして学ぶ Java入門 (静的フィールド)
- 手を動かして学ぶ Java入門 (定数の定義)
- 手を動かして学ぶ Java入門 (クラス継承の超基本)
- 手を動かして学ぶ Java入門 (メソッドのオーバーライド)
- 手を動かして学ぶ Java入門 (メソッドのオーバーロード)
- 手を動かして学ぶ Java入門 (thisキーワード)
- 手を動かして学ぶ Java入門 (superキーワード)