2017-10-20 2 views
-1

は、次のコードを検討:保護されたアクセスのためのJavaルールは、そのような理由は何ですか?

public class Sup { 
    protected void method(){} 
} 

//another package 
class Sub extends Sup { 
    public static void main(String[] args) { 
     new Sub().method(); 
     new Sup().method(); // does not compile 
    } 
} 

私の質問は:それは2番目の呼び出しがコンパイルされないように設計された理由?

+0

エラーメッセージは何ですか? –

+0

なぜあなたはそれをコンパイルすべきだと思いますか? –

+0

OPはコンパイルするとは思わない。彼はまた、プログラムがコンパイルされない理由を尋ねていない。 OPはJavaでこの設計選択の理由を知りたい。 – Zabuza

答えて

1

protectedユーティリティヘルパーメソッドクラス内部のために主に使用されます。彼らはprivateメソッドのように、外部からアクセス可能ではありません。

しかし、クラスを拡張しているがこれらのメソッドにアクセスしたり、変更したりする必要があるかもしれません。だから基本的にのようなものですprivate、その権利は明らかにすべきですが、拡張クラスにもアクセスする機会を与えたいと思います。

このシナリオでは、protectedを言語に含めることを頻繁に行っていました。他にも希望やデザイン提案がある場合は、自由に共有してください。ここで


は、頻繁に引用されoverview table次のとおりです。

  | Class | Package | Subclass | Subclass | World 
      |  |   |(same pkg)|(diff pkg)| 
————————————+———————+—————————+——————————+——————————+———————— 
public  | + | + | +  |  + | +  
————————————+———————+—————————+——————————+——————————+———————— 
protected | + | + | +  |  + |   
————————————+———————+—————————+——————————+——————————+———————— 
no modifier | + | + | +  |   |  
————————————+———————+—————————+——————————+——————————+———————— 
private  | + |   |   |   |  

+ : accessible 
blank : not accessible 

AbstractMapのように、あなたには、いくつかのabstract基本クラスを提供例を考えます。それは内部のものを並べ替える方法を持つことができます。

メソッドprivateを作成することもできますが、拡張クラスが上書きによって再配置手順を変更できるため、protectedにすることもできます。これは、拡張クラスがその特定の構造のために、メソッドのより効率的なバージョンを作成するために使用できる追加の知識を持っている場合に便利です。

2

何JLSは

を言うことはJLSの関連部分は、次の言葉:

Cが保護されたメンバーが宣言されているクラスとします。 Idがインスタンスフィールドまたはインスタンスメソッドを表す場合、アクセスは、その後、唯一さらにサブクラスC.

のS

の本体内に許可されている:

  • アクセス修飾名Qである場合QがExpressionNameの場合、式Qの型がSかSのサブクラスである場合にのみアクセスが許可されます。

  • アクセスがフィールドアクセス式E.Idである場合、 Eがプライマリ式であるか、またはメソッド呼び出し式E.Id(。。)(Eがプライマリ式である場合)によってアクセスが許可されます。 EのpeはSまたはSのサブクラスです。

Source

それがスーパークラスではなく、サブクラスであるとして、それは、第二のルールを通過しない燮のメソッドの呼び出し。

Subの呼び出しは同じクラスなので、ルールを渡します。それはこの

保護されたメンバーがそのようにあなたはいけないあなたがオブジェクトの状態に影響を与えることができるようになる別のオブジェクトのサブクラスからアクセスすることができるという、サブクラスの内部コード内から使用することを意図していると言うのはなぜ

できる。

関連する問題