Java保護されたアクセスが機能しない
-
22-07-2019 - |
質問
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
を定義しなかったため、エラーになります。