Javaアクセス修飾子の完全ガイド:種類、ルール、実践例
Javaアクセス修飾子
このチュートリアルでは、Javaのアクセス修飾子の4つの種類と、明確な例を通じてその使用方法を解説します。
アクセス修飾子とは?
Javaにおいて、アクセス修飾子はクラス、インターフェース、変数、メソッド、コンストラクタ、データメンバの可視性を定義します。例えば、
class Animal { public void method1() {...} private void method2() {...} }
上記の例では、method1はpublicであり、どのクラスからでもアクセス可能です。method2はprivateであり、定義されたクラス内のみに制限されます。
これらのキーワード(publicとprivate)は、Javaにおけるコアな可視性修飾子です。
注意: ゲッターメソッド自体をアクセス修飾子で宣言することはできません。
アクセス修飾子の種類
修飾子の詳細に入る前に、Javaパッケージの理解を確認しておきましょう。
Javaには4つの主要な可視性修飾子があります:
| 修飾子 | 説明 |
|---|---|
| デフォルト(package‑private) | 同じパッケージ内でのみ可視。 |
| Private | 宣言したクラス内でのみ可視。 |
| Protected | 同じパッケージ内と、他パッケージのサブクラスで可視。 |
| Public | どこからでも可視。 |
デフォルトアクセス修飾子
修飾子を指定しない場合、Javaはデフォルト(package‑private)の可視性を適用します。例えば:
package defaultPackage; class Logger { void message() { System.out.println("This is a message"); } }
LoggerクラスはdefaultPackage内のクラスからのみアクセス可能です。別のパッケージから使用しようとするとコンパイルエラーになります。
Privateアクセス修飾子
メンバをprivateで宣言すると、そのアクセスは含むクラス内に限定されます:
class Data { private String name; } public class Main { public static void main(String[] args) { Data d = new Data(); d.name = "Programiz"; // ❌ コンパイルエラー } }
このエラーは、nameがDataクラスのprivateであるため発生します。安全に公開するには、アクセサメソッドを提供します:
class Data { private String name; public String getName() { return this.name; } public void setName(String name) { this.name = name; } } public class Main { public static void main(String[] args) { Data d = new Data(); d.setName("Programiz"); System.out.println(d.getName()); } }
出力:
The name is Programiz
なお、ネストされたクラスはprivateで宣言できますが、トップレベルのクラスやインターフェースはできません。
注意: Javaでは、トップレベルのクラスやインターフェースをprivateにすることはできません。
Protectedアクセス修飾子
protectedでマークされたメンバは、同じパッケージ内と、他パッケージのサブクラスで可視です。例:
class Animal { protected void display() { System.out.println("I am an animal"); } } class Dog extends Animal { public static void main(String[] args) { Dog dog = new Dog(); dog.display(); // ✅ 許可される } }
出力:
I am an animal
Protectedメンバは、トップレベルのクラスやインターフェースで宣言できません。
注意: トップレベルのクラスとインターフェースはprotectedにできません。
Publicアクセス修飾子
publicで宣言されたメンバは、どこからでもアクセス可能です:
// Animal.java public class Animal { public int legCount; public void display() { System.out.println("I am an animal."); System.out.println("I have " + legCount + " legs."); } } // Main.java public class Main { public static void main(String[] args) { Animal animal = new Animal(); animal.legCount = 4; animal.display(); } }
出力:
I am an animal. I have 4 legs.
まとめ:Animal(publicクラス)、legCount(publicフィールド)、display()(publicメソッド)はすべてMainからアクセス可能です。
アクセス修飾子を一枚の図でまとめる

アクセス修飾子はカプセル化の基盤であり、開発者が可視性を制御し、データの整合性を保護することを可能にします。カプセル化について詳しくは、Java Encapsulationを参照してください。
Java
- C# アクセス修飾子を理解する:public、private、protected、internal など
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上
- Java Vectorの理解:使い方、特徴、ArrayListとの比較