Javaコンパイラは、protected
メソッドをpublic
メソッドでオーバーライドしても文句を言いません。ここで何が起こっているのですか?親メソッドをオーバーライドまたは非表示にしていますか親メソッドは可視性が低いので?
サブクラスはスーパークラスの有効な置換であるため、アクセス修飾子を常に広げることができます。 Javaに関する仕様 オーバーライドと非表示の要件 から:
オーバーライドまたは非表示メソッドのアクセス修飾子(§6.6)は、次のように、少なくともオーバーライドまたは非表示メソッドと同じ量のアクセスを提供する必要があります。
- オーバーライドまたは非表示のメソッドがパブリックである場合、オーバーライドまたは非表示のメソッドはパブリックでなければなりません。そうしないと、コンパイル時エラーが発生します。
- オーバーライドまたは非表示のメソッドが保護されている場合は、オーバーライドまたは非表示のメソッドを保護または公開する必要があります。そうしないと、コンパイル時エラーが発生します。
- オーバーライドまたは非表示のメソッドにデフォルト(パッケージ)アクセスがある場合、オーバーライドまたは非表示のメソッドをプライベートにしないでください。そうしないと、コンパイル時エラーが発生します。
外部クラスの観点から見ると、パブリックメソッドはオーバーライドメソッドではなく、新しいメソッドにすぎません。これは、外部クラスが保護されたメソッドにアクセスできなかったためです。
一方、外部クラスは常にスーパークラスのタイプの参照を使用してサブクラスのオブジェクトを参照し、同じメソッドを呼び出すことができるため、可視性を下げることはできません。
可視性は外部アクセシビリティにのみ影響します。 public
メソッドであるため、どの外部クラスでも呼び出すことができます。
オーバーライドするメソッドのアクセスレベルは、元のメソッドの可視性には影響しません。オーバーライド後、任意のアクセスレベルで、元のメソッドにアクセスするには、サブクラスでsuper
を呼び出す必要があります。