Java-access-modifiers
Java-アクセス修飾子
Javaには、クラス、変数、メソッド、およびコンストラクターのアクセスレベルを設定するための多数のアクセス修飾子が用意されています。 4つのアクセスレベルは-
- パッケージに表示されます。デフォルトです。 修飾子は必要ありません。
- クラスにのみ表示されます(プライベート)。
- 世界に見える(公衆)。
- パッケージとすべてのサブクラスに表示されます(保護されています)。
デフォルトのアクセス修飾子-キーワードなし
デフォルトのアクセス修飾子は、クラス、フィールド、メソッドなどのアクセス修飾子を明示的に宣言しないことを意味します。
アクセス制御修飾子なしで宣言された変数またはメソッドは、同じパッケージ内の他のクラスで使用できます。 インターフェイスのフィールドは暗黙的にpublic static finalであり、インターフェイスのメソッドはデフォルトでpublicです。
例
変数とメソッドは、次の例のように、修飾子なしで宣言することができます-
String version = "1.5.1";
boolean processOrder() {
return true;
}
プライベートアクセス修飾子-プライベート
privateと宣言されたメソッド、変数、およびコンストラクターは、宣言されたクラス自体内でのみアクセスできます。
プライベートアクセス修飾子は、最も制限の厳しいアクセスレベルです。 クラスとインタフェースはプライベートにはできません。
クラス内にパブリックgetterメソッドが存在する場合、プライベートと宣言された変数はクラスの外部からアクセスできます。
プライベート修飾子を使用することは、オブジェクトがそれ自体をカプセル化し、データを外部から隠すための主な方法です。
例
次のクラスはプライベートアクセス制御を使用します-
public class Logger {
private String format;
public String getFormat() {
return this.format;
}
public void setFormat(String format) {
this.format = format;
}
}
ここでは、Loggerクラスの_format_変数はプライベートであるため、他のクラスがその値を直接取得または設定する方法はありません。
そのため、この変数を外部で使用できるようにするために、formatの値を返す_getFormat()_と、値を設定する_setFormat(String)_の2つのパブリックメソッドを定義しました。
パブリックアクセス修飾子-パブリック
クラス、メソッド、コンストラクタ、インタフェースなど 宣言されたpublicは他のどのクラスからもアクセスできます。 したがって、パブリッククラス内で宣言されたフィールド、メソッド、ブロックには、Javaユニバースに属する任意のクラスからアクセスできます。
ただし、アクセスしようとしているパブリッククラスが別のパッケージにある場合は、パブリッククラスをインポートする必要があります。 クラス継承のため、クラスのすべてのパブリックメソッドと変数はそのサブクラスによって継承されます。
例
次の機能は、パブリックアクセス制御を使用します-
public static void main(String[] arguments) {
//...
}
アプリケーションのmain()メソッドはパブリックでなければなりません。 そうしないと、クラスを実行するためにJavaインタープリター(javaなど)から呼び出すことができません。
保護されたアクセス修飾子-保護
スーパークラスで保護されていると宣言されている変数、メソッド、およびコンストラクターには、他のパッケージのサブクラスまたは保護されたメンバーのクラスのパッケージ内のクラスのみがアクセスできます。
保護されたアクセス修飾子はクラスとインタフェースには適用できません。 メソッド、フィールドは保護されていると宣言できますが、インターフェイス内のメソッドとフィールドは保護されていると宣言することはできません。
保護されたアクセスはサブクラスにヘルパーメソッドまたは変数を使用する機会を与えますが、無関係のクラスはそれを使用しようとしません。
例
次の親クラスは、保護されたアクセス制御を使用して、その子クラスが_openSpeaker()_メソッドをオーバーライドできるようにします-
class AudioPlayer {
protected boolean openSpeaker(Speaker sp) {
//implementation details
}
}
class StreamingAudioPlayer extends AudioPlayer {
boolean openSpeaker(Speaker sp) {
//implementation details
}
}
ここで、openSpeaker()メソッドをprivateとして定義すると、_AudioPlayer_以外の他のクラスからアクセスできなくなります。 パブリックとして定義すると、すべての外部の世界からアクセス可能になります。 ただし、このメソッドをそのサブクラスのみに公開することを意図しているため、protected修飾子を使用しています。
アクセス制御と継承
継承されたメソッドには次のルールが適用されます-
- スーパークラスでパブリックと宣言されたメソッドは、すべてのサブクラスでもパブリックでなければなりません。
- スーパークラスで保護されていると宣言されたメソッドは、サブクラスで保護またはパブリックである必要があります。プライベートにすることはできません。
- プライベートと宣言されたメソッドはまったく継承されないため、ルールはありません。