アクセス修飾子
アクセス修飾子とは、public、protected、privateといった修飾子の総称で、クラスやそのメンバーがどこからアクセス可能であるかを決定します。
アクセス修飾子 | |
---|---|
アクセス修飾子 | 概要 |
public | すべてのクラスからアクセスできる |
protected | 現在のクラスとサブクラスからアクセスできる |
なし | 現在のクラスと同じパッケージのクラスからアクセスできる |
private | 現在のクラスからだけアクセスできる |
アクセス修飾子を省略した状態を、パッケージ内部からのみ自由にアクセスできるという意味で、パッケージプライベートと言います。
たとえば以下は、それぞれのアクセスレベルの挙動を確認しています。
ModAccess.java
package com.example.mynavi.modifier; public class ModAccess { public String pub_var = "public"; protected String prot_var = "protected"; String pack_var = "package private"; private String pri_var = "private"; public void test() { // クラス内部ではすべてのレベルのメンバーにアクセス可 System.out.println(this.pub_var); System.out.println(this.prot_var); System.out.println(this.pack_var); System.out.println(this.pri_var); } public static void main(String[] args) { ModAccess m = new ModAccess(); m.test(); } }
public protected package private private
ModAccessChild.java
package com.example.mynavi.modifier; // ModAccessのサブクラス public class ModAccessChild extends ModAccess { public void test() { System.out.println(this.pub_var); System.out.println(this.prot_var); System.out.println(this.pack_var); //System.out.println(this.pri_var); // プライベート変数にはアクセス不可 } public static void main(String[] args) { ModAccess mc = new ModAccessChild(); mc.test(); } }
public protected package private
ModAccessOther.java
package com.example.mynavi.other; import com.example.mynavi.modifier.ModAccess; // ModAccessと継承関係のない他パッケージのクラス public class ModAccessOther { public static void main(String[] args) { ModAccess my = new ModAccess(); System.out.println(my.pub_var); // protected以下のメンバーにはアクセス不可 // System.out.println(my.prot_var); // System.out.println(my.pack_var); // System.out.println(my.pri_var); } }
public
アクセス修飾子を付与する際のルールはただひとつ、「要件を満たす範囲でできるだけ狭いアクセス範囲を指定する」ことです。特にパッケージプライベートとpublic/protectedとの間には、大きな差があります。パッケージプライベート/privateであるということはAPIが非公開であることを意味しますので、実装を修正する際にも互換性の維持などを意識する必要はありません。しかし、public/protectedは公開APIなので、利用者に対して一定の責任を負うことになります。