Java アクセス修飾子(public/protected/なし/private)

Javaのアクセス修飾子についてです。

目次

アクセス修飾子 アクセス修飾子
  publicのサンプル
  protectedのサンプル
  修飾子なしのサンプル
  privateのサンプル

アクセス修飾子

アクセス修飾子は、アクセスの範囲を限定します。(スコープを狭める)
範囲が限定されていると、修正時に影響する範囲が狭まり修正しやすくなります。

項目 説明
public すべてのクラスからアクセス可能
protected 1.同じパッケージのクラスからアクセス可能
2.異なるパッケージのサブクラスからアクセス可能
修飾子なし 同じパッケージのクラスからアクセス可能
(パッケージプライベートとも呼ばれます)
private 現在のクラスからアクセス可能

クラスのアクセス修飾子について

トップレベルのクラスではpublicまた修飾子なしのみ使用できます。
インナークラスでは、上記4つとも使用できます。

フィールド、メソッド、コンストラクタのアクセス修飾子について

上記4つとも使用できます。

その他

メンバー変数は基本privateにします。

クラスのアクセスの制限があって次にメンバーのアクセスの制限となります。
アクセス修飾子がなしのクラスAがあった場合、異なるパッケージのクラスBからクラスAのpublicのメソッドにアクセスできません。

protectedは、異なるパッケージから継承させても良い場合に使用したり、サブクラスからアクセスするときの目印的な使われ方が多いです。

アクセス修飾子は、ローカル変数には使用できません。

publicのサンプル

すべてのクラスからアクセス可能であることを確認

メソッドにpublicを使用するサンプルです。

2つのパッケージがあり、それぞれにクラスがあるとします。

Sample1クラスのメソッドがpublicです。
Sample2クラスからSample1クラスにアクセスします。

Sample1.java

1つめのクラスです。

package test1;

public class Sample1 {
		
	public void getNum1() {
		System.out.println("abc");
	}
}

5行目のメソッドのアクセス修飾子はpublicです。

Sample2.java

2つめのクラスです。

package test2;

import test1.Sample1;

public class Sample2 {
	public static void main(String[] args) {
		Sample1 s1 = new Sample1();
		s1.getNum1(); //abc
	}
}

3行目は、Sample1クラスはパッケージが異なるのでインポートしています。
7行目は、異なるパッケージにあるクラスをインスタンス化しています。
8行目は、異なるパッケージにあるメソッドにアクセスしています。
7,8行目は、参照先のクラスとメソッドがpublicでない場合は、コンパイルエラーになります。

protectedのサンプル

異なるパッケージのサブクラスからアクセス可能であることを確認

メソッドにprotectedを使用するサンプルです。

2つのパッケージがあり、それぞれにクラスがあるとします。

Sample1.javaが親クラスで、Sample2.javaが子クラスです。継承しています。
Sample1クラスのメソッドがprotectedです。
Sample2クラスからSample1クラスにアクセスします。

Sample1.java

1つめのクラスです。

package test1;

public class Sample1{

	protected void getNum1() {
		System.out.println("abc");
	}
}

5行目のアクセス修飾子はprotectedです。

Sample2.java

2つめのクラスです。

package test2;

import test1.Sample1;

public class Sample2 extends Sample1 {
	public void S1() {
		getNum1();
	}
}

3行目は、Sample1クラスはパッケージが異なるのでインポートしています。
5行目でSample1クラスを継承しています。
7行目のメソッドで、異なるパッケージにあるメソッドにアクセスしています。
Sample2クラスはSample1クラスの子クラスであり、Sample1クラスのメソッドがprotectedのため可能です。
protectedがない場合は、コンパイルエラーになります。

修飾子なしのサンプル

同じパッケージのクラスからアクセス可能であることを確認

メソッドを修飾子なしにするサンプルです。

同じパッケージに2つのクラスがあるとします。

Sample1クラスのメソッドは修飾子なしです。
Sample2クラスからSample1クラスにアクセスします。

Sample1.java

1つめのクラスです。

package test1;

public class Sample1 {
	
	void getNum1() {
		System.out.println("abc");
	}
}

5行目のアクセス修飾子はありません。

Sample2.java

2つめのクラスです。

package test1;

public class Sample2 {
	public static void main(String[] args) {
		Sample1 s1 = new Sample1();
		s1.getNum1(); //abc
	}
}

6行目のメソッドで、同じパッケージにあるメソッドにアクセスしています。
Sample1クラスのメソッドの修飾子はないため可能です。
Sample1クラスのメソッドがprivateだと、コンパイルエラーになります。

privateのサンプル

メソッドにprivateを使用するサンプルです。

同じパッケージに2つのクラスがあるとします。

Sample1クラスのメソッドにprivateを指定した場合、Sample2クラスからはアクセスできません。
Sample1クラスのprivateのメソッドは、Sample1クラスからのみアクセスできます。

関連の記事

Java クラスで使われる用語のまとめ(メンバー変数等)
Java データ型とは(基本型と参照型)

△上に戻る