PR

初心者必見!Javaのアクセス装飾子のまとめ

スポンサーリンク
この記事は約5分で読めます。

アクセス装飾子

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: 同一クラス内からのみアクセス可能 ​

にほんブログ村 IT技術ブログ IT技術メモへ

コメント

タイトルとURLをコピーしました