【Java】アクセス修飾子

2018年3月11日

本稿は、アクセス修飾子について説明します。

アクセス修飾子は、他のどのクラスからアクセス可能にするかを定義するものです。

publicやprivate やprotectedがあります。

これまでも、一番多く出てきたパターンはpublic classの部分ですね。

その他にも、クラス変数やメソッド、コンストラクタに使用可能です。

publicとすれば、どこからでもアクセス可能です。

protectedとすれば、自クラスと継承したクラスと同パッケージ(同フォルダ)のクラスからアクセス可能です。

何もしていない場合は、自クラスと同パッケージ(同フォルダ)のクラスからアクセス可能です。

privateとすれば、自クラスのみアクセス可能になります。

アクセス制限をすることで得られるメリットは、他の開発者から変数やメソッドを隠ぺいできることです。

隠ぺいすると他の開発者がそのクラスを利用するために、考慮すべきことが減るため、使いやすく、いいクラスになるわけですね。

アクセス修飾子の利用

それでは実際にファイル分けもしながら確認していきましょう。

変数にアクセス修飾子を使用して内容を見ていきます。変数以外に使用したときも基本動作は変わりません。

フォルダ構成はpackフォルダにPackクラスを入れて使用します。
/Test.java
/pack/Pack.java

Pack.java
package pack;
public class Pack{
	public void _public(){
		System.out.println("publicは実行されました。");
	}
}
Test.java
import pack.Pack;
public class Test{
	public static void main(String[] args){
		Pack p = new Pack();
		p._public();
	}
}
実行結果

publicは実行されました。


同じフォルダ階層でprotectedを試してみます。

Pack.java
package pack;
public class Pack{
	protected void _protected(){
		System.out.println("protectedは実行されました。");
	}
}
Test.java
import pack.Pack;
public class Test{
	public static void main(String[] args){
		Pack p = new Pack();
		p._protected();
	}
}
コンパイル結果

Test.java:5: エラー: _protected()はPackでprotectedアクセスされます
p._protected();
^
エラー1個

protectedは継承したクラスと同パッケージ(同フォルダ)のみアクセス可能なのでエラーが出ました。

試しにTestクラスにPackクラスを継承して呼び出してみましょう。

Test.java
import pack.Pack;
public class Test extends Pack{
	Test(){
		super._protected();
	}
	public static void main(String[] args){
		new Test();
	}
}
実行結果

protectedは実行されました。

ちゃんと呼び出されました。


こんどは何もつけていなときです。

フォルダ構成は同じです。

Pack.java
package pack;
public class Pack{
	void _none(){
		System.out.println("(アクセス修飾子なし)は実行されました。");
	}
}
Test.java
import pack.Pack;
public class Test extends Pack{
	public static void main(String[] args){
		Pack p = new Pack();
		p._none();
	}
}

Test.java:5: エラー: Packの_none()はpublicではありません。パッケージ外からはアク
セスできません
p._none();
^
エラー1個

何もつけていない場合は同パッケージ(同フォルダ)のみアクセス可能なのでエラーが出ました。

フォルダ構成を変更しました。
/Test.java
/Pack.java

Pack.java
public class Pack{
	void _none(){
		System.out.println("(アクセス修飾子なし)は実行されました。");
	}
}
Test.java
public class Test extends Pack{
	public static void main(String[] args){
		Pack p = new Pack();
		p._none();
	}
}

(アクセス修飾子なし)は実行されました。


privateでも最初のフォルダ構成で試してみます。

Pack.java
package pack;
public class Pack{
	private void _private(){
		System.out.println("privateは実行されました。");
	}
}
Test.java
import pack.Pack;
public class Test extends Pack{
	public static void main(String[] args){
		Pack p = new Pack();
		p._private();
	}
}

Test.java:5: エラー: _private()はPackでprivateアクセスされます
p._private();
^
エラー1個

privateは外から一切アクセスできないのでエラーが出ました。

別のpublicメソッドから自ら実行してもらいましょう。

Pack.java
package pack;
public class Pack{
	private void _private(){
		System.out.println("privateは実行されました。");
	}
	public void execute(){
		_private();
	}
}
Test.java
import pack.Pack;
public class Test extends Pack{
	public static void main(String[] args){
		Pack p = new Pack();
		p.execute();
	}
}

privateは実行されました。

Java

Posted by nompor