初めに
Javaではアクセス修飾子やモジュールを用いたアクセス制御が存在する。その中でも今回はパッケージによるアクセス制御に着目してみた。
パッケージとは?
パッケージはクラスやインタフェースを管理するために使うもので、以下の機能を提供する。
- 名前空間を提供
- アクセス修飾子と組み合わせてアクセス制御機能を提供
- クラスの分類を可能にする
以下のようにしてパッケージは設定できる。この時package→import→classの順番に記述する。
Java
package beta;
import alpha.Base;
public class Main{
public static void main(String[] args) {
//source
}
}
無名パッケージから無名パッケージへのアクセス
パッケージ名を明示的に設定していない場合は無名パッケージ(デフォルトパッケージ)の扱いとなる。この時、無名パッケージから無名パッケージのアクセスは設定等必要ない。
Java(Main.java)
public class Main {
public static void main(String[] args) {
Hensu.hensu();
}
}
Java(Hensu.java)
public class Hensu {
public static void hensu(){
int hensu = 1;
System.out.println(hensu);
}
}
結果
1
無名パッケージ・名前ありパッケージから名前ありパッケージへのアクセス
以下のようにimport文を使用してアクセス可能。
Java(Main.java)
import alpha.Base;
public class Main {
public static void main(String[] args) {
Base base = new Base(1);
System.out.println(base.getValue());
}
}
Java(Base.java)
package alpha;
public class Base {
private int value;
public Base(int value) {
this.value = value;
}
public int getValue() {
return value;
}
}
結果
1
名前ありパッケージから無名パッケージへのアクセス
これは不可能。無名パッケージは同じく無名パッケージからしかアクセスできない。以下のようにメソッドを指定すると、エラーになる。
Java(Hensu.java)
public class Hensu {
public static void hensu(){
int hensu = 2;
System.out.println(hensu);
}
}
Java(Base.java)
package alpha;
public class Base {
public static void main(String[] args) {
Hensu.hensu();//無名パッケージのクラスを呼び出し
}
}
結果
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Hensu を解決できません
at alpha.Base.main(Base.java:5)
まとめ
- パッケージの役割は名前空間の提供・アクセス修飾子と組み合わせてアクセス制御機能を提供・クラスの分類
- 無名パッケージから無名パッケージへのアクセスに設定は必要ない
- 無名パッケージ・名前ありパッケージから名前ありパッケージへアクセスする場合はimport文を使う
- 名前ありパッケージから無名パッケージへのアクセスは不可