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

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

目次

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

アクセス修飾子

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

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

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

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

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

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

その他

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

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

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

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

カプセル化

クラスとメソッドをpublicにして、フィールド変数をprivateにすることをカプセル化といいます。

メソッドを通してのみ、フィールド変数の取得と設定ができる仕組みです。不正な値の書き換えを防ぐことができます。

カプセル化は、オブジェクト指向の3大要素の一つです。(他は継承とポリモーフィズム)

 

publicのサンプル

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

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

Class1クラスのメソッドがpublicで、Class2クラスのメソッドからアクセスします。

Class1.java

package package1;

public class Class1 {
	public void getName() {
		System.out.println("red");
	}
}

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

Class2.java

package package2;

import package1.Class1;

public class Class2 {
	public static void main(String[] args) {
		Class1 c1 = new Class1();
		c1.getName(); //red
	}
}

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

 

protectedのサンプル

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

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

Class1が親クラスで、Class2が子クラスです。継承しています。
Class1クラスのメソッドがprotectedで、Class2クラスのメソッドからアクセスします。

Class1.java

package package1;

public class Class1 {
	protected void getName() {
		System.out.println("red");
	}
}

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

Class2.java

package package2;

import package1.Class1;

public class Class2 extends Class1{
	void test() {
		getName();
	}
}

3行目は、Class1クラスはパッケージが異なるのでインポートしています。
5行目でClass1クラスを継承しています。
7行目のメソッドで、異なるパッケージにあるメソッドにアクセスしています。

Class2クラスは、Class1クラスからの継承がない場合は7行目のメソッドでコンパイルエラーになります。

Class1のメソッドがprotectedでない場合も、7行目のメソッドでコンパイルエラーになります。(publicは実行可能です)

 

修飾子なしのサンプル

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

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

Class1クラスのメソッドは修飾子なしで、Class2クラスのメソッドからアクセスします。

Class1.java

package package1;

public class Class1 {
	void getName() {
		System.out.println("red");
	}
}

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

Class2.java

package package1;

public class Class2{
	public static void main(String[] args) {
		Class1 c1 = new Class1();
		c1.getName(); //red
	}
}

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

 

privateのサンプル

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

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

関連の記事

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

△上に戻る