年収アップ無料転職カウンセリング実施中! | 転職エージェントはマイナビエージェント

Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職

アクセス修飾子

アクセス修飾子とは、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なので、利用者に対して一定の責任を負うことになります。

修飾子
修飾子
アクセス修飾子
abstract修飾子
static修飾子
final修飾子
transient修飾子
volatile修飾子
synchronized修飾子
native修飾子
strictfp修飾子

年収アップ無料転職カウンセリング実施中! | 転職エージェントはマイナビエージェント

Geekroid-ギークロイド(仮)|ITエンジニアの日常をささいな情報で彩るコラム

ITエンジニアの転職