Categories
Tags
AIML autoboxing AWS aws blockchain CTA data Databricks DataEngineering defer EOL equals findany findfirst GAS Google Drive header html html5 http ipc java Java javascript JSF named-pipe network nft nodejs PostgreSQL PySpark pyspark python Seasar2 serialize smart-contract spark sql stream Teeda TOCTOU UI UML unity catalog UX WCAG web3 Webデザイン word シーケンス図 システム設計 スイムレーン図 セキュリティ ダークパターン デッドロック トランザクション フローチャート レガシーシステム 外部設計 基本設計 設計 設計書 排他制御
674 words
3 min
【Java】protectedのアクセス範囲とは?public/private/package-privateとの違いを解説
この記事は公開日から2年以上が経過しています。
【要約】Java アクセス修飾子4種類のアクセス可能範囲比較
| アクセス修飾子 | 同一クラス内 | 同一パッケージ | 外部パッケージのサブクラス | 外部パッケージの非サブクラス |
|---|---|---|---|---|
public | ○ | ○ | ○ | ○ (全公開) |
protected | ○ | ○ | ○ (継承関係があれば可能) | × |
| (指定なし / デフォルト) | ○ | ○ (パッケージプライベート) | × | × |
private | ○ | × | × | × (完全非公開) |
継承を説明する時に大体出てくる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は同じパッケージに属するクラスか継承しているクラスからアクセスできる。
使用箇所としては継承関係が多めな認識。
継承で再利用でき別パッケージであれば意図しないアクセスが拒否できる点がメリットそう。
関連記事・トピックリンク
【Java】protectedのアクセス範囲とは?public/private/package-privateとの違いを解説
https://tech.storias-blog.com/blogs/java_protected/作者
Storia
公開日
2024-08-06