#質問内容
【結論】
下記ソースコードの子クラスのアクセス修飾子staticなメソッドから、親クラスに宣言されているアクセス修飾子protectedでstaticなメソッドにアクセスできる理由が分かりません。
【詳細】
以前、アクセス修飾子protectedについて下記の質問をさせていただきました。
https://teratail.com/questions/300097
以前の質問でアクセス修飾子protectedの意味合いを正しく理解しました。
【入門書に良くある説明】 「このクラスを継承したサブクラス、または同一パッケージ内のクラスから利用可能」 【詳しい説明】 「このクラスを継承したサブクラス内で再定義されたメソッド、もしくは、 サブクラスで宣言されている継承されたメソッドにアクセス可能。 または同一パッケージ内のクラスから利用可能」
下記ソースコードを例にとると、子クラスであるSubクラスからアクセスできるmethodメソッドは、Subクラスで宣言されてるmethodメソッドだけ、ということになりますが、今回は親クラスにアクセス修飾子がprotectedでstaticなmethodメソッドにアクセスしており、コンパイルが通っています。こうなると、アクセス修飾子protectedの意味がまた分からなくなってしまいました。
超基本的な構文の解釈に誤解があるとは思うのですが、それが分かりません。
下記ソースコードの子クラスのメソッドから、親クラスに宣言されているアクセス修飾子protectedでstaticなメソッドにアクセスできる理由に関して、ご説明できる方がいましたら、宜しくお願い致します。
#ソースコード
######親クラス
package sample; public class Super { protected static void method() { System.out.println("アクセス修飾子protectedなstaticなメソッド"); } }
######子クラス
package test; import sample.Super; public class Sub extends Super{ public static void main(String[] args) { Super.method(); } }
######実行結果
アクセス修飾子protectedなstaticなメソッド
##追記① 「このクラスを継承したサブクラス、または同一パッケージ内のクラスから利用可能」に当てはまらない例
下記ソースコードでは、子クラスで宣言されているメソッドで親クラスのアクセス修飾子protectedで非staticなmethodメソッドを呼び出すとき、次のようなエラーメッセージが表示され、コンパイルエラーが起こります。
メソッド method() は型 Super で不可視です
######親クラス
package sample; public class Super { protected void method() { System.out.println("親クラス"); } }
######子クラス
package test; import sample.Super; public class Sub extends Super{ public static void main(String[] args) { Super su=new Super(); su.method(); //メソッド method() は型 Super で不可視です } }
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/31 09:28
2020/10/31 10:23
2020/10/31 14:32