2017-12-13 7 views
0

それは非常にばかげているようですが、私は本当に混乱しています。コードの下に参照してください。スーパークラスのprotectedメソッドは、別のパッケージのサブクラスで表示されますか?

package com.one; 
public class SuperClass { 
    protected void fun() { 
     System.out.println("base fun"); 
    } 
} 
---- 
package com.two; 
import com.one.SuperClass; 
public class SubClass extends SuperClass{ 
    public void foo() { 
     SuperClass s = new SuperClass(); 
     s.fun(); // Error Msg: Change visibility of fun() to public 
    } 
} 

私は保護されたメンバーは、別のパッケージ内のサブクラスで表示されていることを、同様のOracleドキュメントとhereから読みました。だからfun()はパッケージ2のSubClassに表示されるはずです。それではなぜエラー?

非常に明白な何かがひどく欠けていますか?

+3

このメソッドは、 'SubClass'自体のインスタンスで可視です。ですから 'this.fun()'を呼び出すことができます。しかし、別のインスタンスを作成し、そのメソッドを呼び出そうとすると、 'SubClass'のインスタンスは' ** SuperClass'の**インスタンスとは関係がないので、許可しません。 – Zabuza

+2

"Visible"はあなたに完全な画像を与えません。 'this.fun()'や単に 'fun()'のようなメソッドを呼び出すこともできますが、 'SuperClass'の新しいインスタンスを作成すると、' SubClass'が 'regular "それを継承しているにもかかわらず、" SuperClass "のクライアント。 – dasblinkenlight

+0

今、欠けているリンクがあります。 :)ありがとう – Dexter

答えて

2

Java Language Specification

保護部材又はオブジェクトのコンストラクタは、そのオブジェクトの実装を担当して、それが唯一のコードで宣言されているパッケージの外側からアクセスすることができると言います。それが何を意味するのか

はあなたが元のクラスのパッケージ外のサブクラスを書いている場合は、各オブジェクトが他のオブジェクトに自体にスーパークラスの保護されたメソッドを呼び出すことはできませんが、ということです。

例では、sthisとは異なるオブジェクトであるため、s.fun()に電話をかけることはできません。しかし、そのオブジェクトはまたはちょうどfun()funメソッドを呼び出すことができます。

1

保護されたメソッドは、内部のサブクラスでのみ表示されます。 SuperClassの新しいインスタンスを作成する場合は、外部からアクセスしています。

関連する問題