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

8アクセスレベル

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

アクセスレベル

このページでは、アクセスレベルの使用方法について説明します。

アクセスレベルの種類

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

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

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

アクセスレベルの使用方法についての説明します。下の表はどのアクセスレベルを指定した時、どの範囲まで参照可能かを示したものです。「public」が最も広いアクセスレベルで、どのクラスからも参照可能です。「private」が最も狭いアクセスレベルで、自分のクラス内からしか参照できません。

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

public

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

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

exampleA/ExClassAファイル

package exampleA;

public class ExClassA {
    //publicアクセスレベルを指定します。
    public String exPublic = "publicアクセスレベル";
}

exampleB/ExClassBファイル

package exampleB;

import exampleA.*;

public class ExClassB {
    public static void main(String[] args) {
        ExClassA insA = new ExClassA();
        //publicアクセスレベルが付与されたメンバ変数はどのクラス、どのパッケージからも参照可能です。
        System.out.println(insA.exPublic);
    }
}

protected

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

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

exampleA/ExClassAファイル

package exampleA;

public class ExClassA {
    //protectedアクセスレベルを指定します。
    protected String exProtected = "protectedアクセスレベル";
}

exampleB/SubExClassABファイル

package exampleB;

import exampleA.*;

public class SubExClassAB extends ExClassA {
    public static void main(String[] args) {
        ExClassA insA = new ExClassA();
        //サブクラスから参照する際は、スーパークラスのインスタンスを通して参照することはできません
        //System.out.println(insA.exProtected);

        SubExClassAB insAB = new SubExClassAB();
        //サブクラスから参照する際は、サブクラスのインスタンスを通してのみ参照できます
        System.out.println(insAB.exProtected);
    }
}

無指定(デフォルト)

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

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

exampleA/ExClassAファイル

package exampleA;

public class ExClassA {
    //アクセスレベル無指定(デフォルト)のメンバ変数を宣言します。
    String exDefault = "無指定アクセスレベル";
}

exampleA/SubExClassAファイル

package exampleA;

public class SubExClassA extends ExClassA {
    public static void main(String[] args) {
        ExClassA insA = new ExClassA();
            //サブクラスが同一パッケージ内にあれば、サブクラスからも参照可能です。
        System.out.println(insA.exDefault);
    }
}

private

privateが付与されたメンバ変数、メソッドは同一クラスからのみ参照することができます。privateはアクセスレベルの中で最も参照範囲が狭いです。

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

exampleA/ExClassAファイル

package exampleA;

public class ExClassA {
    //privateアクセスレベルを指定します。
    private String exPrivate = "privateアクセスレベル";

    public static void main(String[] args) {
        ExClassA insA = new ExClassA();
        //privateアクセスレベルが付与されたメンバ変数は同一クラス内からのみ参照可能です。
        System.out.println(insA.exPrivate);
    }
}

使い方指針

アクセスレベルは大まかにいうと、メンバ変数は「private」、クラス、メソッドは「public」で指定し、特別な制御を行う場合に他のアクセスレベルを使用し微調整を行います。

これはオブジェクト指向の概念の一つであるカプセル化に習っています。カプセル化では、メンバ変数への参照を極力制限し、参照する場合は特定のメソッドからのみとすることで、プログラムの不具合の発生を抑えます。参照可能な範囲が広いと、それだけ影響を与える範囲も広くなり不具合の可能性が高くなり、また不具合が発生した場合の特定も困難になります。

下の例は、メンバ変数pointを、同一クラス内からしか参照できないように「private」で指定し、pointを変更する場合は、メソッドaddPointからしか変更できないようした例です。メソッドaddPointは他のクラスからも参照できるように「public」を指定しています。メソッドaddPointでは、変数valueに100以上の値が指定されていた場合、100を上限とする制御を入れています。

【例5】アクセスレベルの使用例

public class ExClassAccess {
    //メンバ変数のアクセスレベルをprivateで指定
    private int point;
    //メソッドのアクセスレベルを他のクラスからも参照できるようpublicで指定
       //メソッド内で、valueが100以上指定できないように制限
    public int addPoint (int value) {
        if (value >= 100) {
            value = 100;
        }
        return this.point = value;
    }
}

8アクセスレベル