📖

Javaの修飾子について

に公開

Javaの修飾子(public / default / protected / private)について

  • private は自分だけ
  • public はどこでも
  • protected はなんとなく子クラス?

実はこれ、「どこから・誰が呼ぶか」を
パッケージと継承の2軸で見ないと必ず混乱します。

修飾子を理解するために焼肉屋モデルを例に使用した記事になればいいと思いました。

修飾子の正体
修飾子は「強さ」ではありません。
どこからアクセスできるかのルールです。

Javaのアクセス可否は、常にこの2つで決まります。

  1. 同じパッケージか?
  2. 継承しているか?

焼肉屋モデル

  • YakinikuShop:焼肉屋そのもの(親クラス)
  • LocalStaff:同じ店のスタッフ
  • Manager:店長(子クラス)
  • BranchStaff:系列店スタッフ(別パッケージ子)
  • Customer:ただの客

親クラス:YakinikuShop.java

package shop;

public class YakinikuShop {

    public int counter = 30;        // 客席:誰でも見える
    int staffRoom = 10;             // 休憩室:同じ店だけ
    protected int kitchen = 20;     // 厨房:店 or 系列
    private int safeMoney = 100;    // 金庫:店長でも直接NG

    public void askManagerToOpenSafe(Object person) {
        if (!(person instanceof Manager)) {
            System.out.println("❌ 店長以外は金庫を開けられません");
            return;
        }
        openSafe();
    }

    private void openSafe() {
        System.out.println("open safe: " + safeMoney);
    }
}

なぜ askManagerToOpenSafe が特別なのか
askManagerToOpenSafe は public です。
つまり誰でも呼べます。

でも金庫が開くかどうかは
中の instanceof 判定で決まる。

public = 何でもできる、ではない
public = 「入口が見える」だけ

public の正体はこれ👇
• ✅ 客でも
• ✅ スタッフでも
• ✅ 他店でも

「お願いする入口」には立てる
• ❌ 店長じゃなければ即追い返される
• ❌ private な金庫は直接触れない

立場 public default protected private
客 ✅ ❌ ❌ ❌
同じ店スタッフ ✅ ✅ ✅ ❌
系列店スタッフ ✅ ❌ ✅ ❌
店長(子クラス) ✅ ✅ ✅ ❌
YakinikuShop自身 ✅ ✅ ✅ ✅

Discussion