アクセス装飾子
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: 同一クラス内からのみアクセス可能
コメント