抽象クラス・インターフェースには、抽象メソッドを宣言することができます。
抽象メソッドの宣言時、アクセス修飾子にはpublicを付与する必要があります。
正確には、インターフェースに抽象メソッドを宣言する場合、アクセス修飾子をつけなければ暗黙的にアクセス修飾子publicが付与されます。
このとき、アクセス修飾子がprivateやアクセス修飾子なし、が許されていない理由は分かります。なぜなら、抽象クラスやインターフェースは他のクラスやインターフェースに継承・実装されることを前提に宣言されており、その中に宣言されている抽象メソッドが、同一クラスから、もしくは、同一パッケージからしかアクセス修飾子できないとなれば、抽象クラス・インターフェースの目的と乖離してしまうからです。
ですが、抽象メソッドのアクセス修飾子がprotectedの場合、抽象クラス・インターフェースの目的に沿った動きになるのではないでしょうか?
繰り返しになりますが、抽象クラス・インターフェースは他クラス・インターフェースから継承・実装されることを前提としています。となると「このクラスを継承したサブクラス、または同一パッケージ内のクラスから利用可能」という条件を持つアクセス修飾子protectedを抽象メソッドに付与しても良いのではないでしょうか?
「そもそも、そういうものだから」と言われればそれまでですが、何らかの理由でpublicのみを許しているはずなので、そのあたりの理由はご存じの方がいらっしゃったら、ご回答いただきたいです。
宜しくお願い致します。
###追記① 抽象クラスの抽象メソッドのアクセス修飾子をprotectedに。
package sample; import test.SampleAb; public class Sample extends SampleAb{ public static void main(String args[]){ SampleAb Ab=new Sample(); Ab.method(); } public void method() { System.out.println("抽象メソッドをオーバーライド"); } }
package test; public abstract class SampleAb{ protected abstract void method(); }
➡このとき、Sampleクラスのmainメソッドの下記の部分でコンパイルエラーが起こります。
Ab.method(); メソッド method() は型 SampleAb で不可視です
回答2件
あなたの回答
tips
プレビュー