Javaのsuperキーワードは、継承を活用して親クラスのメンバーにアクセスするための重要な要素です。オブジェクト指向プログラミング(OOP)ではコードの再利用性や保守性を高めるために継承を活用しますが、その際にsuperを適切に使うことで親クラスのフィールドやメソッドを明示的に呼び出し、意図しない動作を防ぐことができます。
本記事ではsuperの基本的な使い方から、super()を使ったコンストラクタの呼び出し・親の親(祖父クラス)へのアクセス方法・superをつける・つけない場合の違いまで、コードを交えながら徹底解説します。
目次
1.Java superキーワードの基本
Javaのsuperキーワードは、継承の仕組みを活用して親クラスのメンバー(フィールド・メソッド・コンストラクタ)にアクセスするために使われる重要な要素です。
オブジェクト指向プログラミング(OOP)において、クラスの継承はコードの再利用性を高め、保守性を向上させる大きなメリットを持っています。
しかし「子クラスが親クラスの要素と同じ名前のフィールドやメソッドを持つ場合、どちらが優先されるのか?」や「オーバーライド(上書き)したメソッドの中で親クラスの処理を呼び出したい場合はどうするのか?」など、意図しない挙動を防ぐためにsuperを適切に活用することが求められます。
ここでは、superの基本的な役割やthisとの違いをわかりやすく解説していきます。
superとは?
Javaのsuperキーワードは、サブクラス(子クラス)がスーパークラス(親クラス)のフィールドやメソッド、コンストラクタを参照するためのキーワードです。
オブジェクト指向プログラミングにおいて、superは「親クラスの機能を適切に継承・制御する」ために不可欠です。
Java super()の基本的な使い方
superには、主に以下の3つの使い方があります。
親クラスのフィールドを参照する
親クラスのメソッドを呼び出す
親クラスのコンストラクタを呼び出す(super())
それぞれ詳しく見ていきましょう。
superを使ったフィールドの参照
サブクラスが親クラスのフィールドと同じ名前のフィールドを持つ場合、デフォルトではサブクラスのフィールドが優先されます。しかし、superを使うことで親クラスのフィールドを明示的に参照できます。
class Parent { int num = 10; }
int num = 20;
System.out.println("子クラスのnum: " + num); // 子クラスのフィールドを参照 System.out.println("親クラスのnum: " + super.num); // 親クラスのフィールドを参照 } }
public static void main(String[] args) { Child obj = new Child(); obj.display(); } }
子クラスのnum: 20 親クラスのnum: 10 |
superを使ったメソッドの呼び出し
サブクラスが親クラスのメソッドをオーバーライド(上書き)した場合でも、superを使えば親クラスのメソッドを呼び出すことができます。
class Parent { void show() { System.out.println("Parentクラスのメソッド"); } }
void show() { super.show(); // 親クラスのメソッドを呼び出す System.out.println("Childクラスのメソッド"); } }
public static void main(String[] args) { Child obj = new Child(); obj.show(); } }
Parentクラスのメソッド Childクラスのメソッド |
super()を使ったコンストラクタの呼び出し
親クラスのコンストラクタは、子クラスのコンストラクタ内でsuper()を使って呼び出すことができます。これは、継承関係のあるクラスで親クラスの初期化処理を適切に行うために重要です。
class Parent { Parent() { System.out.println("親クラスのコンストラクタ"); } }
Child() { super(); // 親クラスのコンストラクタを明示的に呼び出し System.out.println("子クラスのコンストラクタ"); } }
public static void main(String[] args) { Child obj = new Child(); } }
親クラスのコンストラクタ 子クラスのコンストラクタ |
superとthisの違い
Javaには、superと似たキーワードとしてthisがあります。それぞれの違いを比較してみましょう。
キーワード | 参照対象 | 使用場面 |
---|---|---|
this | 自クラスのメンバー | インスタンス変数やメソッドの呼び出し |
super | 親クラスのメンバー | 継承した親クラスのメンバーを呼び出す |
関連記事
Javaプログラミングで何ができる?始め方や基本文法、練習サイト5つを紹介
Javaとは?Web開発で利用されるJavaの特徴や実行方法、おすすめ資格を解説
2.Javaにおけるsuperと継承の関係
Javaのsuperキーワードは、継承の概念と密接に関連しています。継承を適切に活用することで、コードの再利用性や保守性を高め、オブジェクト指向設計をより効率的に実装することができます。
継承は、既存のクラス(親クラス)の属性(フィールド)やメソッドを再利用しつつ、新しいクラス(子クラス)を定義する仕組みです。継承のメリットは下記の通りです。
コードの再利用
同じコードを繰り返し書く必要がない
保守性の向上
修正が親クラスに集中するため管理が楽
オブジェクト指向設計の強化
共通機能をまとめることでシンプルな設計が可能
継承を使うことで、親クラスのフィールドやメソッドをそのまま使えますが、子クラスから明示的に親クラスのメンバーを呼び出したい場合にはsuperを使う必要があります。
関連記事
Javaのオーバーライド攻略|オーバーロードとの違いや使い方・条件・戻り値などわかりやすく解説
3.Java superを使って2つ上の親クラスを参照する方法
Javaでは、クラスの継承を多階層(親クラス・祖父クラス)にわたって行うことが可能です。しかし、親の親(祖父クラス)のメンバーを直接参照する方法はあるのでしょうか。
通常、superキーワードは「直接の親クラス」にのみアクセスできます。そのため、super.superのように2つ上のクラス(祖父クラス)を直接参照する構文は存在しません。
しかし、適切な設計をすれば、間接的に祖父クラスのメソッドやコンストラクタを呼び出すことは可能です。
superは親の親(祖父クラス)を直接参照できるのか?
Javaでは、多階層の継承(親クラス・祖父クラスなど)が可能ですが、superを使って「親の親(祖父クラス)」を直接参照することはできません。
つまり、super.superという構文はJavaでは許可されていません。
下記は、エラーが発生するコードです。
class GrandParent { void show() { System.out.println("祖父クラスのメソッド"); } }
void show() { System.out.println("親クラスのメソッド"); } }
void show() { // super.super.show(); // コンパイルエラー System.out.println("子クラスのメソッド"); } }
public static void main(String[] args) { Child obj = new Child(); obj.show(); } } |
superは直接の親クラスのみを参照でき、2つ上のクラス(祖父クラス)には直接アクセスできないためエラーが発生します。
superを使って間接的に親の親(祖父クラス)を参照する
super.superが使えない場合、どのように祖父クラスのメソッドを呼び出せばよいのでしょうか。答えは「親クラスの中でsuperを使う」ことです。
class GrandParent { void show() { System.out.println("祖父クラスのメソッド"); } }
void show() { super.show(); // 祖父クラスのメソッドを呼び出し System.out.println("親クラスのメソッド"); } }
void show() { super.show(); // 親クラスのメソッドを呼び出し(その中で祖父クラスのメソッドが呼ばれる) System.out.println("子クラスのメソッド"); } }
public static void main(String[] args) { Child obj = new Child(); obj.show(); } }
祖父クラスのメソッド 親クラスのメソッド 子クラスのメソッド |
こちらのコードのポイントは下記です。
Parentクラスのshow()メソッドでsuper.show();を実行
祖父クラスのメソッドが呼ばれる
Childクラスのshow()メソッドでsuper.show();を実行
親クラスのメソッドが呼ばれる(その中で祖父クラスのメソッドも実行)
このポイントをおさえることで、間接的にsuperを使って祖父クラスのメソッドを参照できます。
superを使って2つ上の親クラスのコンストラクタを呼び出す
コンストラクタについても、super.super()のような構文は存在しませんが、間接的に祖父クラスのコンストラクタを呼び出すことは可能です。
class GrandParent { GrandParent() { System.out.println("祖父クラスのコンストラクタ"); } }
Parent() { super(); // 祖父クラスのコンストラクタを呼び出し System.out.println("親クラスのコンストラクタ"); } }
Child() { super(); // 親クラスのコンストラクタを呼び出し(その中で祖父クラスのコンストラクタも呼ばれる) System.out.println("子クラスのコンストラクタ"); } }
public static void main(String[] args) { Child obj = new Child(); } }
祖父クラスのコンストラクタ 親クラスのコンストラクタ 子クラスのコンストラクタ |
super();を使って順番にコンストラクタが実行されるため、祖父クラスのコンストラクタも呼び出されます。
Java superと継承なしで2つ上の親クラスの機能を使う方法
どうしても祖父クラスの機能を子クラスで直接使いたい場合は、継承の代わりにコンポジションを使用する方法もあります。
class GrandParent { void show() { System.out.println("祖父クラスのメソッド"); } }
GrandParent grandParent = new GrandParent();
grandParent.show(); // 祖父クラスのメソッドを呼び出す } }
Parent parent = new Parent();
parent.show(); // 親クラスのメソッドを呼び出し(その中で祖父クラスのメソッドも実行) System.out.println("子クラスのメソッド"); } }
public static void main(String[] args) { Child obj = new Child(); obj.show(); } }
祖父クラスのメソッド 子クラスのメソッド |
コンポジション(has-a関係)を使うことで、継承に依存せずに親の親のメソッドを活用できます。
4.Java superをつける・つけないの違い
Javaのsuperキーワードは、継承の仕組みを活用して親クラスのメンバーにアクセスするために使用されます。
しかしsuperをつけるべきケースと、つけなくてもよいケースがあるため、適切な使い分けを理解することが重要です。superを適切に使用するためのルールは下記の通りです。
ケース | super | 理由 |
---|---|---|
親クラスと同名のフィールドを参照 | つける | 競合を防ぐため |
オーバーライドされたメソッドを呼ぶ | つける | 親クラスの処理を明示的に呼び出す |
親クラスのコンストラクタを呼ぶ | つける | 明示的に引数を渡す場合 |
オーバーライドしていないメソッドを呼ぶ | つけない | そのまま呼び出せる |
名前が異なる親クラスのフィールドを使う | つけない | superなしでアクセス可能 |
関連記事
Java初心者ガイド|Java学習のロードマップと効率良い勉強方法を解説
5.まとめ
Javaのsuperキーワードは、継承の仕組みを適切に活用するための重要な要素です。superを使うことで親クラスのフィールドやメソッドを明示的に参照し、オーバーライドされたメソッドの親クラスの処理を呼び出すことができます。
また、コンストラクタの継承においても、super()を使用することで、親クラスのコンストラクタを適切に呼び出すことが可能です。
一方で、superは直接の親クラスにしかアクセスできず、2つ上の親クラス(祖父クラス)を直接参照することはできません。
しかし、親クラスの中でsuperを利用することで、間接的に祖父クラスのメンバーを呼び出すことが可能です。また、コンポジション(has-a関係)を活用することで、継承に頼らずに柔軟な設計を実現できます。
本記事が皆様にとって少しでもお役に立てますと幸いです。
「フリーランスボード」は、数多くのフリーランスエージェントが掲載するITフリーランスエンジニア・ITフリーランス向けの案件・求人を一括検索できるサイトです。
開発環境、職種、単価、稼働形態、稼働日数など様々な条件から、あなたに最適なフリーランス案件・求人を簡単に見つけることができます。
単価アップを目指す方や、自分の得意なスキルを活かせる案件に参画したい方は、ぜひ「フリーランスボード」をご利用ください。