Java修飾子(public, protected, privateなど)まとめ!Java超初心者の勉強

覚えようと思っても覚えられないのでチートを作ります。よくみる修飾子のみでまとめています。
(Eclipseで実験した結果や調べた結果です。間違えがあればご指摘いただければと思います。)

アクセス修飾子

クラス・フィールド・メソッドなどに他のクラスへの公開範囲をアクセス修飾子(Access modifiers)で表せます。

修飾子説明
publicすべてのクラスからアクセスが可能
protected同一パッケージに属しているか、継承しているサブクラスからのみアクセスが可能
なし(デフォルト)同一パッケージに属しているクラスからのみアクセスが可能
privateクラス内のみアクセスが可能

基本的に上記のルールですが細かく分けて書いていきます。

クラスの修飾子一覧

クラスにつけられる修飾子の一覧。

修飾子説明
publicすべてのクラスからアクセスが可能public class Test{}
なし(デフォルト)同一パッケージに属しているクラスからのみアクセスが可能class Test{}
final継承禁止 (サブクラスの作成不可)final class Test{}
abstractpublicを省略した場合暗黙的に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と、デフォルト値や暗黙的な修飾を意思もなく使わないようにしています。といってもつけるの忘れていたりしますが。はじめのうちはなるべくデフォルト値を使わないほうが覚えられる気がします。(デフォルトってなんだっけ?となるので)

Java

Posted by Nakamoto