Javaでprotectedメソッドはオーバーライドできる?アクセス修飾子のルールを解説
はい、スーパークラスのprotectedメソッドは、サブクラスでオーバーライドすることができます。ただし、アクセス修飾子に関する重要なルールがあります。スーパークラスのメソッドがprotectedである場合、サブクラスでオーバーライドするメソッドにはprotectedまたはpublicを指定できますが、デフォルト(パッケージプライベート)やprivateにすることはできません。つまり、サブクラスのオーバーライドメソッドは、元のメソッドよりも弱いアクセス修飾子を持つことができないのです。
アクセス修飾子のルールまとめ
- protected → protected または public への変更は可能
- protected → デフォルト(アクセス修飾子なし)への変更は不可
- protected → private への変更は不可
- オーバーライド時のアクセスレベルは、元のメソッドと同じか、それより広い範囲である必要がある
コード例
class A {
protected void protectedMethod() {
System.out.println("スーパークラスのprotectedメソッド");
}
}
class B extends A {
@Override
protected void protectedMethod() {
System.out.println("サブクラスのprotectedメソッド");
}
}
public class Test {
public static void main(String args[]) {
B b = new B();
b.protectedMethod();
}
}実行結果
サブクラスのprotectedメソッド
この例では、クラスAのprotectedメソッド「protectedMethod」を、クラスBが同じくprotectedとしてオーバーライドしています。mainメソッドでクラスBのインスタンスを生成してメソッドを呼び出すと、ポリモーフィズムにより、オーバーライドされたサブクラス側のメソッドが実行されます。
なお、オーバーライド時にアクセス範囲を広げてpublicにすることも有効です。これは、外部からより自由にメソッドを呼び出せるようにしたい場合などに活用されます。逆に、privateやデフォルトへ狭めるコンパイルエラーになるため、注意しましょう。
-
JavaのSwingUtilities.invokeLater()メソッドの使い方を徹底解説
invokeLater()メソッドとはinvokeLater()メソッドは、SwingUtilitiesクラスが提供するstaticメソッドの一つで、AWTイベントディスパッチスレッド(Event Dispatch Thread)上でタスクを非同期に実行するために使用されます。このメソッドはSwingUtilities.invokeAndWait()とよく似た動作をしますが、大きな違いは、処理のリクエストをイベントキューに登録した後、すぐに呼び出し元へ制御を返すという点です。つまり、invokeLater()は引数で渡されたRunnableオブジェクト内のコードブロックの実行完了を待ちません。
-
JavaでJPanelのpaintComponent()メソッドを実装する方法をわかりやすく解説
JPanelはJavaにおける軽量コンテナであり、それ自体は不可視(インビジブル)なコンポーネントとして扱われます。デフォルトのレイアウトにはFlowLayoutが採用されています。JPanelを生成した後は、Containerクラスから継承されたadd()メソッドを呼び出すことで、ボタンやラベルなどの他のコンポーネントをJPanelオブジェクトに自由に追加できます。 paintComponent()メソッドとは このメソッドは、単なる背景色の描画にとどまらず、JPanel上に独自の図形や画像などを描画したい場合に必要となります。paintComponent()メソッドはすでにJPanelクラ