teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

一部修正しました。

2020/10/24 10:06

投稿

karakorum
karakorum

スコア20

title CHANGED
File without changes
body CHANGED
@@ -15,7 +15,7 @@
15
15
 
16
16
  public class Sample extends SampleAb{
17
17
  public static void main(String args[]){
18
- SampleAb Ab=new Exp();
18
+ SampleAb Ab=new Sample();
19
19
  Ab.method();
20
20
  }
21
21
  public void method() {

1

抽象クラスの抽象メソッドのアクセス修飾子をprotectedにした時のソースコードを追記しました。

2020/10/24 10:06

投稿

karakorum
karakorum

スコア20

title CHANGED
File without changes
body CHANGED
@@ -5,4 +5,34 @@
5
5
  ですが、抽象メソッドのアクセス修飾子がprotectedの場合、抽象クラス・インターフェースの目的に沿った動きになるのではないでしょうか?
6
6
  繰り返しになりますが、抽象クラス・インターフェースは他クラス・インターフェースから継承・実装されることを前提としています。となると「このクラスを継承したサブクラス、または同一パッケージ内のクラスから利用可能」という条件を持つアクセス修飾子protectedを抽象メソッドに付与しても良いのではないでしょうか?
7
7
  「そもそも、そういうものだから」と言われればそれまでですが、何らかの理由でpublicのみを許しているはずなので、そのあたりの理由はご存じの方がいらっしゃったら、ご回答いただきたいです。
8
- 宜しくお願い致します。
8
+ 宜しくお願い致します。
9
+
10
+
11
+ ###追記① 抽象クラスの抽象メソッドのアクセス修飾子をprotectedに。
12
+ ```
13
+ package sample;
14
+ import test.SampleAb;
15
+
16
+ public class Sample extends SampleAb{
17
+ public static void main(String args[]){
18
+ SampleAb Ab=new Exp();
19
+ Ab.method();
20
+ }
21
+ public void method() {
22
+ System.out.println("抽象メソッドをオーバーライド");
23
+ }
24
+ }
25
+ ```
26
+ ```
27
+ package test;
28
+
29
+ public abstract class SampleAb{
30
+ protected abstract void method();
31
+ }
32
+ ```
33
+ ➡このとき、Sampleクラスのmainメソッドの下記の部分でコンパイルエラーが起こります。
34
+ ```
35
+ Ab.method();
36
+
37
+ メソッド method() は型 SampleAb で不可視です
38
+ ```