無名パッケージのクラスは、無名パッケージからしかアクセスできない!

Java Silver

パッケージ宣言をせずにクラス宣言した場合、

そのクラスは「無名パッケージ」に属するクラスとなります。

「無名パッケージ」に属しているクラスには、

「無名パッケージ」に属しているクラスからしかアクセスすることができません。

無名パッケージ内のクラス同士は双方アクセス可能

例えば、以下のプログラムであれば、

Aクラス、Bクラスそれぞれが「無名パッケージ」に属しているため、

インポート宣言無しでも、双方向でアクセス可能です。

public class A(){
  public static String strA = "A";
  
  public static void main(String[] args){
    System.out.println(strB);//←Bクラスにアクセス可能
  }
}
public class B(){
  public static String strB = "B";

  public static void main(String[] args){
    System.out.println(strA);//←Aクラスにアクセス可能
  }
}

無名パッケージにアクセスできない例

以下のように、明示的にパッケージ宣言をしたCクラスからは、

無名パッケージに属しているAクラス、Bクラスにアクセスすることはできません。

package jp.co.xxx;

public class C(){
  public static String strC = "C";

  public static void main(String[] args){
    System.out.println(strA);//←Aクラスにアクセス不可
    System.out.println(strB);//←Bクラスにアクセス不可
  }
}

無名パッケージのクラスにアクセスできない理由

これは、インポート宣言で「無名パッケージ」を指定することができないためです。

構文:「import パッケージ名.クラス名」

↑無名パッケージなので、パッケージ名を指定できない。

逆に、

インポート宣言をすることで、別パッケージに属しているクラスにアクセスすることは可能なので、

以下のように、Aクラス、Bクラスから、Cクラスにアクセスすることは可能です。

import jp.co.xxx.C;

public class A(){
  public static String strA = "A";
  
  public static void main(String[] args){
    System.out.println(strC);//←Cクラスにアクセス可能
  }
}
import jp.co.xxx.C;

public class B(){
  public static String strB = "B";
  
  public static void main(String[] args){
    System.out.println(strC);//←Cクラスにアクセス可能
  }
}

コメント

タイトルとURLをコピーしました