674 words
3 min

【Java】protectedのアクセス範囲とは?public/private/package-privateとの違いを解説

2024-08-06

この記事は公開日から2年以上が経過しています。

【要約】Java アクセス修飾子4種類のアクセス可能範囲比較#

アクセス修飾子同一クラス内同一パッケージ外部パッケージのサブクラス外部パッケージの非サブクラス
public○○○○ (全公開)
protected○○○ (継承関係があれば可能)×
(指定なし / デフォルト)○○ (パッケージプライベート)××
private○××× (完全非公開)

継承を説明する時に大体出てくるprotectedについて
人に説明をしようとした時に、実はあまり理解できてなかったのでまとめ。

protectedとは?#

Javaのprotectedは、クラスのメンバー(フィールドやメソッド)のアクセス制御を行うために使用するもの。
protectedが付けられたメンバーは、次の場合にアクセスできる。

  1. 同じパッケージ内のクラス:
    同じパッケージに属するクラスからアクセスできる。

  2. サブクラス(継承関係):
    継承しているクラスからアクセスできる。
    サブクラスが異なるパッケージに存在していても、継承しているクラスであればアクセスできる。

Sample.java
package com.example;

public class Parent {
    protected void display() {
        System.out.println("protectedのメソッド");
    }
}

/* -------------------- */
package com.example;

public class Child extends Parent {
    public void show() {
        display();  // protectedの対象と同じパッケージ内なのでアクセス可能
    }
}

/* -------------------- */
package com.another;
import com.example.Parent;

public class AnotherChild extends Parent {
    public void show() {
        display();  // 異なるパッケージでも継承関係があるのでアクセス可能
    }
}

/* -------------------- */
package com.another;
import com.example.Parent;

public class AnotherClass {
    public void show() {
        Parent parent = new Parent();
        parent.display();  // 異なるパッケージかつ、継承関係でもないのでアクセス不可
    }
}

protectedの利点は何?#

  1. 親クラスのデータやメソッドをprotectedにすることで、
    サブクラスに対して適切な範囲でのみアクセスを許可し、外部から意図しない変更がされなくなる。

  2. 継承関係にあるクラスで、親クラスのprotectedメンバーを再利用することで、
    コードの重複を避けて保守しやすいコードがかける。
    サブクラスは親クラスのprotectedメンバーにアクセスできるので
    親クラスの機能を拡張しやすい。

protectedの注意点#

protectedは別パッケージに対してはprivateだが
同一パッケージに関してはpublicのためクラスの内部実装が広範囲に公開される可能性がある。
継承しかさせないつもりでクラスを作ったとしても
同一パッケージのクラスからはすべて読み込めてしまうので
パッケージの作り方を気にしつつ、必要最小限の範囲で使用することがよい。

まとめ#

protectedは同じパッケージに属するクラスか継承しているクラスからアクセスできる。
使用箇所としては継承関係が多めな認識。
継承で再利用でき別パッケージであれば意図しないアクセスが拒否できる点がメリットそう。

【Java】protectedのアクセス範囲とは?public/private/package-privateとの違いを解説
https://tech.storias-blog.com/blogs/java_protected/
作者
Storia
公開日
2024-08-06