【Java】アクセス修飾子を変更してメソッドをオーバーライドできる?ルールと注意点を解説
結論から言うと、Javaではアクセス修飾子だけを変更してメソッドをオーバーライドすることが可能です。ただし、守らなければならない重要なルールが1つあります。
オーバーライド時のアクセス修飾子の基本ルール
オーバーライドするメソッドのアクセスレベルは、元となるメソッド(スーパークラス側のメソッド)のアクセスレベルより厳しく制限することはできません。これはJava言語仕様として定められた規則です。
具体例で確認しよう
たとえば、スーパークラスのメソッドが public として宣言されている場合、サブクラスでオーバーライドするメソッドを private や protected に変更することはできません。この場合、オーバーライドするメソッドも public である必要があります。
class Parent {
public void display() {
System.out.println("親クラスのメソッド");
}
}
class Child extends Parent {
// OK:public → public は許可される
@Override
public void display() {
System.out.println("子クラスのメソッド");
}
// NG:public → private はコンパイルエラーになる
/*
private void display() {
System.out.println("子クラスのメソッド");
}
*/
}
アクセスレベルごとの許可範囲一覧
| スーパークラスの修飾子 | サブクラスで指定できる修飾子 |
|---|---|
public | public のみ |
protected | protected、public |
| デフォルト(指定なし) | デフォルト、protected、public |
private | オーバーライド不可(継承されないため) |
なぜこのルールがあるのか
この制限は、ポリモーフィズム(多態性)を正しく機能させるために設けられています。もしサブクラス側でアクセスレベルを狭めてしまうと、スーパークラス型の変数経由で呼び出せるはずのメソッドが、実際のオブジェクトによっては呼び出せなくなるという矛盾が発生します。これを防ぐため、オーバーライド時には同等かより緩いアクセスレベルしか指定できないようになっています。
-
Javaメソッドのオーバーライドのルールを徹底解説
Javaにおいて、メソッドを適切にオーバーライドするためには、いくつかの重要なルールを守る必要があります。この記事では、オーバーライドを行う際に考慮すべきルールを項目別に整理し、わかりやすく解説します。 オーバーライドの基本ルール 引数リストは、オーバーライド対象のメソッドと完全に同一である必要があります。 戻り値の型は、スーパークラスで宣言された元のメソッドの戻り値の型と同じであるか、そのサブタイプ(共変戻り値)である必要があります。 インスタンスメソッドは、サブクラスに継承されている場合にのみオーバーライドできます。継承されていないメソッドはオーバーライドできません。 コンストラクタは
-
Javaのメソッドオーバーライドとは?仕組みとサンプルコードを解説
オーバーライドとはオーバーライド(Override)とは、サブクラスが親クラスから継承したメソッドを、自身の要件に合わせて再定義できる機能です。これにより、サブクラスはその型に固有の振る舞いを実装することができます。オブジェクト指向の観点で言えば、オーバーライドとは「既存のメソッドの機能を上書きする」ことを意味します。オーバーライドの例具体的な例を見てみましょう。以下のコードでは、Animal クラスの move() メソッドを、Dog クラスがオーバーライドしています。class Animal { public void move() {&nbs