質問

Javaには、3つのアクセスレベルがあります:

  • 公開-世界に公開
  • プライベート-クラスのみに開く
  • Protected-クラスとそのサブクラスのみを開きます(継承)。

では、なぜJavaコンパイラがこれを許可するのですか?

TestBlah.java:

public class TestBlah {

    public static void main(String[] args) {
        Blah a = new Blah("Blah");
        Bloo b = new Bloo("Bloo");
        System.out.println(a.getMessage());
        System.out.println(b.getMessage()); //Works
        System.out.println(a.testing);
        System.out.println(b.testing); //Works
    }
}

Blah.java:

public class Blah {
    protected String message;

    public Blah(String msg) {
        this.message = msg;
    }

    protected String getMessage(){
        return(this.message);
    }   
}

Bloo.java:

public class Bloo extends Blah {
    public Bloo(String testing) {
        super(testing);
    }
}
役に立ちましたか?

解決

実際には次のようになります。

  

同じパッケージのクラスのみを開く クラスとそのサブクラス(継承)

だからこそ

他のヒント

保護されているとは、同じパッケージ内のサブクラスまたはを意味するためです。

そして、実際には4番目の「デフォルト」があります。修飾子を省略した場合のアクセスレベル。同じパッケージ内の他のクラスへのアクセスを提供します。

つまり、 protected はデフォルトアクセスと public アクセスの間にあります。

より具体的には、C ++の場合と同様に protected が機能することを期待しています。

ただし、Javaでは意味が異なります。 Javaでは、保護されたメソッドをクラス(もちろん)、同じパッケージ内の他のすべてのクラス、およびこのクラスのサブクラスで使用できます。他のパッケージのクラスは、この元のクラスをサブクラス化しない限りアクセスできません。

同様の質問を見る継承マーカーのより具体的な情報。

個人的に、 protected はほとんど使用しません。フレームワークではなくアプリケーションを開発するため、 public メソッド、 private データを定義し、非常に頻繁にクラス全体を final

実際には、「パブリック」、「保護」、「プライベート」の4つのアクセスレベルがあります。 &デフォルトは、パッケージプライベートまたはパッケージ保護とも呼ばれます。デフォルトでは、パッケージへのアクセシビリティが制限されています。デフォルトは非常に便利で、頻繁に使用します。

b Bloohを拡張する Bloo 型であるため、 b.getMessage()を呼び出すことができます。 code>、および getMessage()は保護されています。前述のように、保護はサブクラスがメソッドにアクセスすることを許可します。

ただし、次のエラーが発生しています:

  • Bloo コンストラクターで引数なしで super()を呼び出すとエラーになります。 Stringパラメーターでコンストラクターを定義したため、コンパイラーはパラメーターなしの Blah コンストラクターを見つけることができません。
  • TestBlah main メソッドで new Blah()を呼び出すと、上記と同じ理由でエラーになります。
  • a.testing および b.testing を参照すると、クラスの変数 testing を定義しなかったため、エラーになります。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top