Java superキーワード完全攻略:高度な活用法と実践例
Javaのsuperキーワードをマスターする:高度な活用法と実践例
superキーワードがJavaの継承でいかに強力な機能を解放するか、明確な例と専門的なガイダンスで発見してください。
superキーワードはJavaの継承モデルの基石であり、サブクラスが直属のスーパークラスのメンバ(フィールド、メソッド、コンストラクタ)を参照できるようにします。そのニュアンスを理解することは、クリーンで保守しやすいコードを書くために不可欠です。
superの主な用途
- オーバーライドされたスーパークラスメソッドの呼び出し。
- サブクラスフィールドでシャドウイングされているスーパークラスフィールドへのアクセス。
- サブクラスコンストラクタからスーパークラスコンストラクタを明示的に呼び出し。
それぞれのシナリオをコードサンプルで掘り下げます。
1. オーバーライドされたスーパークラスメソッドの呼び出し
サブクラスがメソッドをオーバーライドすると、スーパークラス版はsuper.methodName()でアクセス可能です。これは元の機能を失わずに振る舞いを拡張する際に重要です。
例:メソッドオーバーライドとsuper
class Animal { public void display() { System.out.println("I am an animal"); } } class Dog extends Animal { @Override public void display() { System.out.println("I am a dog"); } public void printMessage() { display(); // Dog.display()を呼び出し super.display(); // Animal.display()を呼び出し } } public class Main { public static void main(String[] args) { Dog dog = new Dog(); dog.printMessage(); } }
出力:
I am a dog I am an animal
super.display()を使用することで、スーパークラスの実装が実行され、機能を置き換えるのではなく拡張する際に有用です。
2. シャドウイングされたスーパークラスフィールドへのアクセス
スーパークラスとサブクラスの両方が同じ名前のフィールドを宣言している場合、サブクラスフィールドがスーパークラスのものをシャドウイングします。super.fieldNameで元のフィールドを参照できます。
例:フィールドのシャドウイング
class Animal { protected String type = "animal"; } class Dog extends Animal { public String type = "mammal"; public void printType() { System.out.println("I am a " + type); // Dog.type System.out.println("I am an " + super.type); // Animal.type } } public class Main { public static void main(String[] args) { Dog dog = new Dog(); dog.printType(); } }
出力:
I am a mammal I am an animal
3. super()によるスーパークラスコンストラクタの呼び出し
コンストラクタは継承されませんが、サブクラスはsuper()でスーパークラスのコンストラクタを呼び出せます。これはサブクラスコンストラクタの最初の文でなければならず、スーパークラスに引数なしコンストラクタがない場合や引数を渡す必要がある場合に必須です。
例1:デフォルトコンストラクタの呼び出し
class Animal { Animal() { System.out.println("I am an animal"); } } class Dog extends Animal { Dog() { super(); System.out.println("I am a dog"); } } public class Main { public static void main(String[] args) { new Dog(); } }
出力:
I am an animal I am a dog
例2:パラメータ付きコンストラクタの呼び出し
class Animal { Animal(String type) { System.out.println("Type: " + type); } } class Dog extends Animal { Dog() { super("Animal"); System.out.println("I am a dog"); } } public class Main { public static void main(String[] args) { new Dog(); } }
出力:
Type: Animal I am a dog
パラメータ付きの場合、コンパイラは非デフォルトコンストラクタを自動的に呼び出せないため、super(arguments)が必須です。
superキーワードをマスターすることで、堅牢な継承階層を書けるようになり、オーバーライドされたロジックがアクセス可能で、コンストラクタが適切に初期化されることを保証します。これらのテクニックはスケーラブルなJavaアプリケーションに不可欠であり、業界の専門家が推奨するベストプラクティスと一致します。
Java
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java if…elseをマスター:制御フローを徹底解説
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
- Java Vectorの理解:使い方、特徴、ArrayListとの比較