Categories
Tags
ai aiml autoboxing aws blockchain cta data databricks dataengineering defer eol equals findany findfirst gas google-drive header html html5 http ipc java javascript jsf kohya_ss lora named-pipe network nft nodejs postgresql pyspark python seasar2 serialize smart-contract spark sql stable diffusion 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