アクセス装飾子
Javaにおけるアクセス修飾子(アクセスコントロール)は、クラス、メンバ変数、メソッドの可視性を制御するために使用されます。継承において、アクセス修飾子は特に重要です。以下に、各アクセス修飾子の特性と継承時の振る舞いについて説明します。
public
public
修飾子が付いたメンバは、どのクラスからもアクセス可能です。
特性
- どこからでもアクセス可能(同一パッケージ内および異なるパッケージからも)。
- スーパークラスの
public
メンバは、サブクラスでそのままアクセス可能です。
例
class Animal { public void makeSound() { System.out.println("美味しそうに食事をしていますね!何の動物かな?"); } } class Dog extends Animal { @Override public void makeSound() { System.out.println("ワン!"); } } Animal animal = new Animal(); animal.makeSound(); // 出力: 美味しそうに食事をしていますね!何の動物かな? Dog dog = new Dog(); dog.makeSound(); // 出力: ワン!
2. protected
protected
修飾子が付いたメンバは、同一パッケージ内のクラスおよびサブクラスからアクセス可能です。
特性
- 同一パッケージ内からアクセス可能。
- 異なるパッケージ内のサブクラスからもアクセス可能。
- スーパークラスの
protected
メンバは、サブクラスからアクセス可能です。
例
class Animal { protected void makeSound() { System.out.println("美味しそうに食事をしていますね!何の動物かな?"); } } class Dog extends Animal { @Override protected void makeSound() { System.out.println("ワン!"); } } Animal animal = new Animal(); // animal.makeSound(); // エラー: makeSound()はprotectedなのでアクセスできない Dog dog = new Dog(); dog.makeSound(); // 出力: ワン!
3. default
(パッケージプライベート)装飾子を書かない場合も同様
特にアクセス修飾子が指定されていない場合、デフォルトの可視性はパッケージプライベート(パッケージ内可視)となります。
特性
- 同一パッケージ内からのみアクセス可能。
- 異なるパッケージ内のサブクラスからはアクセスできません。
例
class Animal { void makeSound() { System.out.println("美味しそうに食事をしていますね!何の動物かな?"); } } class Dog extends Animal { @Override void makeSound() { System.out.println("ワン!"); } } Animal animal = new Animal(); animal.makeSound(); // 出力: 美味しそうに食事をしていますね!何の動物かな? Dog dog = new Dog(); dog.makeSound(); // 出力: ワン!
4. private
private
修飾子が付いたメンバは、そのクラス内からのみアクセス可能です。サブクラスからはアクセスできません。
特性
- 同一クラス内からのみアクセス可能。
- サブクラスからもアクセスできない。
例
class Animal { private void makeSound() { System.out.println("美味しそうに食事をしていますね!何の動物かな?"); } } class Dog extends Animal { // makeSound() メソッドはオーバーライドできない void bark() { System.out.println("ワン!"); } } Animal animal = new Animal(); // animal.makeSound(); // エラー: makeSound()はprivateなのでアクセスできない Dog dog = new Dog(); // dog.makeSound(); // エラー: makeSound()はprivateなのでアクセスできない dog.bark(); // 出力: ワン!
継承における注意点
- サブクラスはスーパークラスの
private
メンバにはアクセスできません。 - サブクラスはスーパークラスの
public
およびprotected
メンバにアクセスできます。 - サブクラスは、スーパークラスが同じパッケージにある場合、
default
(パッケージプライベート)メンバにもアクセスできます。
アクセス装飾子のまとめ
アクセス修飾子 | 同一クラス内 | 同一パッケージ内 | 異なるパッケージの サブクラス |
異なるパッケージの 他のクラス |
---|---|---|---|---|
public | 〇 | 〇 | 〇 | 〇 |
protected | 〇 | 〇 | 〇 | × |
default (パッケージプライベート) 装飾子を書かない場合も同様 |
〇 | 〇 | × | × |
private | 〇 | × | × | × |
上記の表にまとめた通り、Javaのアクセス修飾子について以下のように整理されています
- public: すべてのクラスからアクセス可能
- protected: 同一クラス、同一パッケージ、異なるパッケージのサブクラスからアクセス可能
- default(パッケージプライベート): 同一クラス、同一パッケージからアクセス可能
- private: 同一クラス内からのみアクセス可能
コメント