Javaに関する様々な情報をご紹介します。

8アクセスレベル

Javaに関する様々な情報をご紹介します。

アクセスレベル

このページでは、クラスメンバ変数メソッドコンストラクタの宣言時に指定するアクセスレベルについて説明します。アクセスレベルを指定することにより他のクラスから自クラスのメンバ変数にアクセスさせないなどを指定することができます。

アクセスレベルの種類

構成要素ごとの指定できるアクセスレベルを以下の表に記載します。クラス宣言時に指定できるアクセスレベルは「public」と「指定無し(デフォルト)」のみです。

アクセスレベル クラス メンバ変数 メソッド コンストラクタ
public
protected ×
指定無し(デフォルト)
private ×

アクセスレベルの使用方法

ここでは実際のアクセスレベルの使用方法についての説明します。主にメンバ変数、メソッドについての説明を行います。クラスコンストラクタについての詳細はそれぞれの各ページで行っていますため、そちらを参照してください。下の表はどのアクセスレベルを指定した時、どの範囲まで参照が可能かを表したものです。

アクセスレベル 同一クラス 同一パッケージ サブクラス すべて
public
protected ×
指定無し(デフォルト) × ×
private × × ×
アクセスレベル

public

publicが付与されたメンバ変数、メソッドはどこからでも参照することができます。publicは指定できるアクセスレベルのうち、最も参照制限が低いものです。

【例1】アクセスレベルpublicの使用例です。

exampleA/ExClassAファイル

package exampleA;

public class ExClassA {
    public    String exPublic = "publicアクセスレベル";
    protected String exProtected = "protectedアクセスレベル";
        String exDefault = "無指定アクセスレベル";
    private   String exPrivate = "privateアクセスレベル";
}

exampleB/ExClassBファイル

package exampleB;

import exampleA.*;

public class ExClassB {  //(1)
    public static void main(String[] args) {
        ExClassA objectA = new ExClassA();  //(2)

        System.out.println(objectA.exPublic);  //(3)
        //System.out.println(objectA.exProtected);  //(4)
        //System.out.println(objectA.exDefault);  //(5)
        //System.out.println(objectA.exPrivate);  //(6)
    }
}

解説1

  1. (1)参照したいメンバ変数が宣言されているExClassAクラスと異なるパッケージでExClassAを継承しないExClassBクラスを宣言します。
  2. (2)ExClasssAクラスのオブジェクトobjectAを宣言・生成します。
  3. (3)アクセスレベルpublicが付与されたメンバ変数exPublicを参照します。publicはどこからでも参照が可能なため、exPublicの表示を行います。
  4. (4)アクセスレベルprotectedが付与されたメンバ変数exProtectedを参照します。protectedは同一クラス、同一パッケージ、サブクラスが参照条件のため、参照することができません。
  5. (5)アクセスレベル無指定(デフォルト)のメンバ変数exDefaultを参照します。無指定(デフォルト)は同一クラス、同一パッケージが参照条件のため、参照することができません。
  6. (6)アクセスレベルprivateが付与されたメンバ変数exPrivateを参照します。privateは同一クラスが参照条件のため、参照することができません。

【実行結果1】(パッケージとして、exampleAディレクトリ、exampleBディレクトリを作成し、そこにExClassA.javaファイル、ExClassB.javaファイルをそれぞれ配置し、実行します。)

D:\JAVA>javac exampleB/ExClassB.java

D:\JAVA>java exampleB/ExClassB
publicアクセスレベル

D:\JAVA>

protected

protectedが付与されたメンバ変数、メソッドは同一クラス、同一パッケージ、サブクラスから参照することができます。注意点はサブクラスからアクセスできるのはサブクラスのオブジェクトを通してのみということです。サブクラスからスーパークラスのオブジェクトを通して参照することはできません。

【例2】アクセスレベルprotectedの使用例です。

exampleA/ExClassAファイル

package exampleA;

    public class ExClassA {
    public    String exPublic = "publicアクセスレベル";
    protected String exProtected = "protectedアクセスレベル";
        String exDefault = "無指定アクセスレベル";
    private   String exPrivate = "privateアクセスレベル";
}

exampleB/ExClassBファイル

package exampleB;

import exampleA.*;

public class ExClassB extends ExClassA {  //(1)
    public static void main(String[] args) {
        ExClassA objectA = new ExClassA();  //(2)
        System.out.println(objectA.exPublic);  //(3)
        //System.out.println(objectA.exProtected);  //(4)
        //System.out.println(objectA.exDefault);  //(5)
        //System.out.println(objectA.exPrivate);  //(6)

        ExClassB objectB = new ExClassB();  //(7)
        System.out.println(objectB.exProtected);  //(8)
    }
}

解説2

  1. (1)参照したいメンバ変数が宣言されているExClassAクラスと異なるパッケージでExClassAを継承するExClassBクラスを宣言します。
  2. (2)ExClasssAクラスのオブジェクトobjectAを宣言・生成します。
  3. (3)アクセスレベルpublicが付与されたメンバ変数exPublicを参照します。publicはどこからでも参照が可能なため、exPublicの表示を行います。
  4. (4)アクセスレベルprotectedが付与されたメンバ変数exProtectedを参照します。protectedをサブクラスから参照する時はサブクラスのオブジェクトを通す必要があります。スーパークラス(ExClassA)のオブジェクト(objectA)を通して参照することはできません。
  5. (5)アクセスレベル無指定(デフォルト)のメンバ変数exDefaultを参照します。無指定(デフォルト)は同一クラス、同一パッケージが参照条件のため、参照することができません。
  6. (6)アクセスレベルprivateが付与されたメンバ変数exPrivateを参照します。privateは同一クラスが参照条件のため、参照することができません。
  7. (7)クラスExClassBのオブジェクトobjectBを宣言・生成します。
  8. (8)アクセスレベルprotectedが付与されたメンバ変数exProtectedを参照します。
    protectedはサブクラス(ExClassB)のオブジェクト(objectB)を通して参照が可能なため、exProtectedの表示を行います。

【実行結果2】(パッケージとして、exampleAディレクトリ、exampleBディレクトリを作成し、そこにExClassA.javaファイル、ExClassB.javaファイルをそれぞれ配置し、実行します。)

D:\JAVA>javac exampleB/ExClassB.java

D:\JAVA>java exampleB/ExClassB
publicアクセスレベル
protectedアクセスレベル

D:\JAVA>

無指定(デフォルト)

アクセスレベルが無指定(デフォルト)のメンバ変数、メソッドは同一クラス、同一パッケージから参照することができます。サブクラスが同一パッケージ内にあれば、サブクラスからもアクセスすることができます。

【例3】アクセスレベル無指定(デフォルト)の使用例です。

exampleA/ExClassAファイル

package exampleA;

public class ExClassA {
    public    String exPublic = "publicアクセスレベル";
    protected String exProtected = "protectedアクセスレベル";
        String exDefault = "無指定アクセスレベル";
    private   String exPrivate = "privateアクセスレベル";
}

exampleB/ExClassBファイル

package exampleA;

public class ExClassB {  //(1)
    public static void main(String[] args) {
        ExClassA objectA = new ExClassA();  //(2)
        System.out.println(objectA.exPublic);  //(3)
        System.out.println(objectA.exProtected);  //(4)
        System.out.println(objectA.exDefault);  //(5)
        //System.out.println(objectA.exPrivate);  //(6)
    }
}

解説3

  1. (1)参照したいメンバ変数が宣言されているExClassAクラスと同じパッケージに属するExClassBクラスを宣言します。
  2. (2)ExClasssAクラスのオブジェクトobjectAを宣言・生成します。
  3. (3)アクセスレベルpublicが付与されたメンバ変数exPublicを参照します。publicはどこからでも参照が可能なため、exPublicの表示を行います。
  4. (4)アクセスレベルprotectedが付与されたメンバ変数exProtectedを参照します。protectedは同一パッケージから参照可能なため、exProtectedの表示を行います。
  5. (5)アクセスレベル無指定(デフォルト)のメンバ変数exDefaultを参照します。無指定(デフォルト)は同一パッケージから参照可能なため、exDefaultの表示を行います。
  6. (6)アクセスレベルprivateが付与されたメンバ変数exPrivateを参照します。privateは同一クラスが参照条件のため、参照することができません。

【実行結果3】(パッケージとして、exampleAディレクトリを作成し、そこにExClassA.javaファイル、ExClassB.javaファイルをそれぞれ配置し、実行します。)

D:\JAVA>javac exampleA/ExClassB.java

D:\JAVA>java exampleA/ExClassB
publicアクセスレベル
protectedアクセスレベル
無指定アクセスレベル

D:\JAVA>

private

privateが付与されたメンバ変数、メソッドは同一クラスからのみ参照することができます。privateはアクセスレベルの中で最も参照制限が強いものです。セキュリティを考えるとメンバ半数は、特別な理由がない限りprivateアクセスレベルをつけて宣言します。

【例4】アクセスレベルprivateの使用例です。

exampleA/ExClassAファイル

package exampleA;

public class ExClassA {
    public    String exPublic = "publicアクセスレベル";
    protected String exProtected = "protectedアクセスレベル";
        String exDefault = "無指定アクセスレベル";
    private   String exPrivate = "privateアクセスレベル";

    //(1)同一クラス内からの参照
    public static void main(String[] args) {
        ExClassA objectA = new ExClassA();  //(2)
        System.out.println(objectA.exPublic);  //(3)
        System.out.println(objectA.exProtected);  //(4)
        System.out.println(objectA.exDefault);  //(5)
        System.out.println(objectA.exPrivate);  //(6)
    }
}

解説4

  1. (1)参照したいメンバ変数が宣言されているクラスと同一クラスから参照します。
  2. (2)ExClasssAクラスのオブジェクトobjectAを宣言・生成します。
  3. (3)アクセスレベルpublicが付与されたメンバ変数exPublicを参照します。publicはどこからでも参照が可能なため、exPublicの表示を行います。
  4. (4)アクセスレベルprotectedが付与されたメンバ変数exProtectedを参照します。protectedは同一クラスから参照可能なため、exProtectedの表示を行います。
  5. (5)アクセスレベル無指定(デフォルト)のメンバ変数exDefaultを参照します。無指定(デフォルト)は同一クラスから参照可能なため、exDefaultの表示を行います。
  6. (6)アクセスレベルprivateが付与されたメンバ変数exPrivateを参照します。privateは同一クラスから参照可能なため、exPrivateの表示を行います。

【実行結果4】(パッケージとして、exampleAディレクトリを作成し、そこにExClassA.javaファイルを配置し、実行します。)

D:\JAVA>javac exampleA/ExClassA.java

D:\JAVA>java exampleA/ExClassA
publicアクセスレベル
protectedアクセスレベル
無指定アクセスレベル
privateアクセスレベル

D:\JAVA>

8アクセスレベル