【Java】アクセス修飾子
本稿は、アクセス修飾子について説明します。
アクセス修飾子は、他のどのクラスからアクセス可能にするかを定義するものです。
publicやprivate やprotectedがあります。
これまでも、一番多く出てきたパターンはpublic classの部分ですね。
その他にも、クラス変数やメソッド、コンストラクタに使用可能です。
publicとすれば、どこからでもアクセス可能です。
protectedとすれば、自クラスと継承したクラスと同パッケージ(同フォルダ)のクラスからアクセス可能です。
何もしていない場合は、自クラスと同パッケージ(同フォルダ)のクラスからアクセス可能です。
privateとすれば、自クラスのみアクセス可能になります。
アクセス制限をすることで得られるメリットは、他の開発者から変数やメソッドを隠ぺいできることです。
隠ぺいすると他の開発者がそのクラスを利用するために、考慮すべきことが減るため、使いやすく、いいクラスになるわけですね。
アクセス修飾子の利用
それでは実際にファイル分けもしながら確認していきましょう。
変数にアクセス修飾子を使用して内容を見ていきます。変数以外に使用したときも基本動作は変わりません。
フォルダ構成はpackフォルダにPackクラスを入れて使用します。
/Test.java
/pack/Pack.java
package pack; public class Pack{ public void _public(){ System.out.println("publicは実行されました。"); } }
import pack.Pack; public class Test{ public static void main(String[] args){ Pack p = new Pack(); p._public(); } }
publicは実行されました。
同じフォルダ階層でprotectedを試してみます。
package pack; public class Pack{ protected void _protected(){ System.out.println("protectedは実行されました。"); } }
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クラスを継承して呼び出してみましょう。
import pack.Pack; public class Test extends Pack{ Test(){ super._protected(); } public static void main(String[] args){ new Test(); } }
protectedは実行されました。
ちゃんと呼び出されました。
こんどは何もつけていなときです。
フォルダ構成は同じです。
package pack; public class Pack{ void _none(){ System.out.println("(アクセス修飾子なし)は実行されました。"); } }
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
public class Pack{ void _none(){ System.out.println("(アクセス修飾子なし)は実行されました。"); } }
public class Test extends Pack{ public static void main(String[] args){ Pack p = new Pack(); p._none(); } }
(アクセス修飾子なし)は実行されました。
privateでも最初のフォルダ構成で試してみます。
package pack; public class Pack{ private void _private(){ System.out.println("privateは実行されました。"); } }
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メソッドから自ら実行してもらいましょう。
package pack; public class Pack{ private void _private(){ System.out.println("privateは実行されました。"); } public void execute(){ _private(); } }
import pack.Pack; public class Test extends Pack{ public static void main(String[] args){ Pack p = new Pack(); p.execute(); } }
privateは実行されました。
ディスカッション
コメント一覧
まだ、コメントがありません