Javaメソッドオーバーライド完全ガイド:ルール、super、アクセス制御
Javaメソッドオーバーライドをマスターする
実践例、主要ルール、強力なsuperキーワードを用いてJavaのメソッドオーバーライドを探求します。
先週は継承——サブクラスがスーパークラスからプロパティと振る舞いを継承できるコアOOP機能——を扱いました。今度はメソッドオーバーライド——サブクラスが親クラスで既に定義されているメソッドの独自実装を提供する場合——に深入りします。
例1:基本的なメソッドオーバーライド
class Animal { public void displayInfo() { System.out.println("I am an animal."); } } class Dog extends Animal { @Override public void displayInfo() { System.out.println("I am a dog."); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.displayInfo(); } }
出力:
I am a dog.
このスニペットでは、AnimalとDogの両方がdisplayInfo()を宣言しています。Dogインスタンスが呼び出すと、サブクラスの実装が実行され、オーバーライドを示します。
@Overrideアノテーションに注目してください。これはメソッドがスーパークラス版を置き換える意図であることをコンパイラに伝え、シグネチャが一致しない場合はエラーを出します。必須ではありませんが、偶発的なミスを防ぐベストプラクティスです。
Javaオーバーライドのルール
- メソッド名、戻り値の型、パラメータリストは両クラスで同一でなければなりません。
- Finalやstaticメソッドはオーバーライドできません。
- スーパークラスのabstractメソッドは、具象サブクラスで必ずオーバーライドしなければなりません。
superを使ったスーパークラスメソッドの呼び出し
オーバーライド後でも親メソッドを呼び出せますか? もちろん——superキーワードを使います。
例2:superの活用
class Animal { public void displayInfo() { System.out.println("I am an animal."); } } class Dog extends Animal { public void displayInfo() { super.displayInfo(); System.out.println("I am a dog."); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.displayInfo(); } }
出力:
I am an animal. I am a dog.
ここでは、DogがまずsuperでAnimal.displayInfo()を呼び出し、その後独自のメッセージを追加しています。
コンストラクタは継承されないため、「コンストラクタのオーバーライド」は存在しません。ただし、サブクラスはsuper()でスーパークラスのコンストラクタを呼び出せます——Java superキーワードガイドを参照してください。
オーバーライド時のアクセスレベル
オーバーライドされたメソッドの可視性は異なってもよいですが、アクセスを広げる方向のみです。
スーパークラスのメソッドがprotectedなら、サブクラスではprotectedまたはpublicにできますが、privateにはできません。
例3:可視性の変更
class Animal { protected void displayInfo() { System.out.println("I am an animal."); } } class Dog extends Animal { public void displayInfo() { System.out.println("I am a dog."); } } class Main { public static void main(String[] args) { Dog d1 = new Dog(); d1.displayInfo(); } }
出力:
I am a dog.
publicはprotectedより広いアクセスを提供するため、このオーバーライドは有効です。
Abstractメソッドのオーバーライド
Abstractクラスはしばしばボディなしでメソッドを宣言します。具象サブクラスは実装を提供しなければならず、そうでなければコンパイラがエラーを出します。Abstractクラスについては今後のチュートリアルで詳しく扱います。
Java
- Java演算子をマスター:種類、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアノテーションタイプ完全ガイド:事前定義・カスタム・メタアノテーション
- Java String.length()メソッド:文字列サイズ取得の実例解説
- Java String.indexOf()マスター:部分文字列検索と実践例
- Java String.charAt()完全解説:構文、戻り値、例外、実例
- Java String.compareTo()マスター:構文、ユースケース、実践例
- Java String.contains()メソッド:部分文字列チェックの実践例
- Java String.endsWith()マスター:文字列サフィックスチェック実例付き
- Java文字列置換マスター:replace()、replaceAll()、replaceFirst()徹底解説