覚えようと思っても覚えられないのでチートを作ります。よくみる修飾子のみでまとめています。
(Eclipseで実験した結果や調べた結果です。間違えがあればご指摘いただければと思います。)
アクセス修飾子
クラス・フィールド・メソッドなどに他のクラスへの公開範囲をアクセス修飾子(Access modifiers)で表せます。
| 修飾子 | 説明 |
|---|---|
| public | すべてのクラスからアクセスが可能 |
| protected | 同一パッケージに属しているか、継承しているサブクラスからのみアクセスが可能 |
| なし(デフォルト) | 同一パッケージに属しているクラスからのみアクセスが可能 |
| private | クラス内のみアクセスが可能 |
基本的に上記のルールですが細かく分けて書いていきます。
クラスの修飾子一覧
クラスにつけられる修飾子の一覧。
| 修飾子 | 説明 | 例 |
|---|---|---|
| public | すべてのクラスからアクセスが可能 | public class Test{} |
| なし(デフォルト) | 同一パッケージに属しているクラスからのみアクセスが可能 | class Test{} |
| final | 継承禁止 (サブクラスの作成不可) | final class Test{} |
| abstract | publicを省略した場合暗黙的にpublicで修飾される (抽象クラス。abstractメソッドの定義が可能になる (継承したクラスでオーバーライドする)。 インスタンス化できない。抽象クラスという。) | abstract class Test{} またはpublic abstract class Test{} |
クラスのprotectedとprivateについて
トップレベルのクラスにはpublicまたはデフォルトのみが使用できます。
ネストされたクラスにはprivate、protectedも使用可能です。
例
public Test{
private Test2{}
}
参考:Why can’t a class or an interface receive private or protected access modifiers?
コンストラクタの修飾子
| 修飾子 | 説明 | 例 |
|---|---|---|
| public | どこからでもアクセスが可能 | public Test(){} |
| protected | 同一クラス、同一パッケージ、継承しているサブクラスからのアクセスが可能 | protected Test(){} |
| なし(デフォルト) | 同一パッケージに属しているクラスからのみアクセスが可能 | Test(){} |
| private | 同一クラスのみアクセスが可能 | private Test(){} |
メソッドの修飾子
| 修飾子 | 説明 | 例 |
|---|---|---|
| public | すべてのクラスからアクセスが可能 | public void test(){} |
| protected | 同一クラス、同一パッケージ、継承しているサブクラスからのアクセスが可能 | protected void test(){} |
| なし(デフォルト) | 同一パッケージに属しているクラスからのみアクセスが可能 | void test(){} |
| private | 同一クラスのみアクセスが可能 | private void test(){} |
| final | オーバーライド禁止 | public final void test(){} |
| abstract | 抽象メソッド。 (継承したクラスでオーバーライドする)。 インターフェースの抽象メソッドは暗黙的にpublic abstractで修飾される。 (抽象クラスではpublic, protected, デフォルトが設定可能) | public abstract void test(); |
| static | 静的メソッド | public static void test(){} |
フィールド(変数)の修飾子
| 修飾子 | 説明 | 例 |
|---|---|---|
| public | すべてのクラスからアクセスが可能 | public String str |
| protected | 同一クラス、同一パッケージ、継承しているサブクラスからのアクセスが可能 | protected String str |
| なし(デフォルト) | 同一パッケージに属しているクラスからのみアクセスが可能 | String str |
| private | 同一クラスのみアクセスが可能 | private String str |
| final | 定数 (値の変更ができない) | public final String str |
| static | 静的変数 | public static String str |
インターフェースの修飾子
| 修飾子 | 説明 | 例 |
|---|---|---|
| public | すべてのクラスからアクセスが可能 | public interface Test{} |
| なし(デフォルト) | 同一パッケージに属しているクラスからのみアクセスが可能 インターフェースではpublicが基本(補完して使用するため) | interface Test{} |
| abstract | 特に変化はない。(現在は使用しないことが推奨) 参考:Java: Abstract interfaces and abstract interface methods | abstract interface Test{} |
インターフェースについてよくわからない場合は以下でまとめていますのでよかったらどうぞ。
おわり
インタフェースのフィールドはstatic finalになるため省略が可能など、ルールがあります。そのため省略して書く方も多いと思います。省略して書いたほうが見やすくていいです。
しかし私ははじめにプログラミングを教えていただいた人に明示的にプログラマーの意思を伝えるためにもなるべくpublicの時はpublicと、デフォルト値や暗黙的な修飾を意思もなく使わないようにしています。といってもつけるの忘れていたりしますが。はじめのうちはなるべくデフォルト値を使わないほうが覚えられる気がします。(デフォルトってなんだっけ?となるので)

