🦁
Javaのprotectedについて
継承を説明する時に大体出てくるprotected
について
人に説明をしようとした時に、実はあまり理解できてなかったのでまとめ。
protectedとは?
Javaのprotected
は、クラスのメンバー(フィールドやメソッド)のアクセス制御を行うために使用するもの。
protected
が付けられたメンバーは、次の場合にアクセスできる。
-
同じパッケージ内のクラス:
同じパッケージに属するクラスからアクセスできる。 -
サブクラス(継承関係):
継承しているクラスからアクセスできる。
サブクラスが異なるパッケージに存在していても、継承しているクラスであればアクセスできる。
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の利点は何?
-
親クラスのデータやメソッドをprotectedにすることで、
サブクラスに対して適切な範囲でのみアクセスを許可し、外部から意図しない変更がされなくなる。 -
継承関係にあるクラスで、親クラスのprotectedメンバーを再利用することで、
コードの重複を避けて保守しやすいコードがかける。
サブクラスは親クラスのprotectedメンバーにアクセスできるので
親クラスの機能を拡張しやすい。
protectedの注意点
protected
は別パッケージに対してはprivate
だが
同一パッケージに関してはpublic
のためクラスの内部実装が広範囲に公開される可能性がある。
継承しかさせないつもりでクラスを作ったとしても
同一パッケージのクラスからはすべて読み込めてしまうので
パッケージの作り方を気にしつつ、必要最小限の範囲で使用することがよい。
まとめ
protected
は同じパッケージに属するクラスか継承しているクラスからアクセスできる。
使用箇所としては継承関係が多めな認識。
継承で再利用でき別パッケージであれば意図しないアクセスが拒否できる点がメリットそう。
Discussion