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

3パッケージの参照

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

パッケージの参照

このページではパッケージの参照方法及び、その関連事項について説明します。

パッケージの参照方法

パッケージの参照方法は大きく3つあります。

1. パッケージ名を含めた限定名による参照

パッケージ名を含めた限定名とは参照する際その参照名にパッケージ名を含めたものを言います。限定名による参照は以下の枠内のフォーマットで構成されます。

パッケージ名 . (ドット)クラス名

【例1】パッケージPackageA内のExクラスを限定名で参照する例です。

//Exクラスのオブジェクトobject1を生成
PackageA.Ex object1 = new PackageA.Ex(); 

2. 参照したいパッケージのクラスをインポート

参照したいクラスが属するパッケージとそのクラスをインポートします。インポートの構文は以下の枠内のフォーマットで構成されます。import文はpackage文の下、(package文がない場合は先頭)に記述します。import文を使用するとインポートしたクラスに対しては限定名を使用する必要はなくなります。

import パッケージ名 . (ドット)クラス名;

【例2】パッケージPackageAに属するExクラスをインポートする例です。

package PackageB;

import PackageA.Ex;

・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
//Exクラスのオブジェクトobject1を生成
//PackageA.Exをインポートしているため、限定名は必要ない。
Ex object1 = new Ex();
・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・

3. 参照したいパッケージ全体をインポート

参照したいクラスが1つのパッケージ内に複数ある場合、パッケージ全体をインポートします。このことによりimport文の記述を簡易に行えるようになります。パッケージ全体をインポートする構文は以下の枠内のフォーマットで構成されます。

import パッケージ名 . *

【例3】パッケージPackageA全体をインポートする例です。

package PackageB;

import PackageA.*;

・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・
//PackageAに属するEx1クラスとEx2クラスのオブジェクトを生成。
//パッケージ全体をインポートしているため、すべてのクラスに
//おいて限定名は必要ない。
Ex1 object1 = new Ex1();
Ex2 object2 = new Ex2();
・・・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・・・

※ 複数のパッケージに同一のクラス名が存在する場合

複数のパッケージに同一のクラス名が存在する場合は注意が必要です。複数のパッケージをインポートし、単純名によりクラスを参照する際、どちらのパッケージに属するクラスかJava実行システムが判別できないため、コンパイルエラーとなります。

【例4】複数のパッケージに同一のクラス名が存在する例です。

PackageA/ExPackage.javaファイル

package PackageA;  //(1)パッケージPackageAの作成

public class ExPackage {  //(2)
    public void showName() {
        System.out.println("PackageAに属します。");
    }
}

PackageB/ExPackage.javaファイル

package PackageB;  //(3)パッケージPackageBの作成

public class ExPackage {  //(4)
    public void showName() {
        System.out.println("PackageBに属します。");
    }
}

ExPackage2.javaファイル

import PackageA.*;  //(5)PackageAのインポート
import PackageB.*;  //(6)PackageBのインポート

public class ExPackage2 {
    public static void main(String[] args) {
        ExPackage object1 = new ExPackage();  //(7)
        object1.showName();
    }
}

解説4

  1. (1)パッケージPackageAの作成を行います。
  2. (2)パッケージPackageAに属するクラスExPackageの定義を行います。
  3. (3)パッケージPackageBの作成を行います。
  4. (4)パッケージPackageBに属するクラスExPackageの定義を行います。
  5. (5)PackageA全体をインポートします。
  6. (6)PackageB全体をインポートします。
  7. (7)ExPackageクラスのオブジェクトobject1を生成します。PackageAに属するExPackageクラスか、PackageBに属するExPackageクラスか判別できないため、コンパイルエラーとなります。

実行結果4

D:\JAVA>javac ExPackage2.java
ExPackage2.java:6: ExPackage の参照はあいまいです。PackageB の クラス PackageB.E xPackage と PackageA の クラス PackageA.ExPackage が両方適合します。
   ExPackage object1 = new ExPackage();
   ^
ExPackage2.java:6: ExPackage の参照はあいまいです。PackageB の クラス PackageB.E xPackage と PackageA の クラス PackageA.ExPackage が両方適合します。
   ExPackage object1 = new ExPackage();
   ^
エラー 2 個

D:\JAVA>

この場合はクラスを参照する際、パッケージ名も含めた限定名で参照するか、参照したいクラスを指定してインポートする必要があります。このようなエラーを防ぐためにも、指定できるのであればパッケージ全体をインポートするのではなく、使用するクラスのみをインポートすることが推奨されています。

パッケージのディレクトリ構成

パッケージを作成する際、そのパッケージを配置するディレクトリ構成に注意する必要があります。パッケージ名がcom.company.packageAであった場合、ディレクトリ構成はcom/company/packageA/ソースファイル・クラスファイルという形をとります。パッケージ名の.とUNIXファイルシステムの/(Windowsの場合は\)は一致させる必要があります。

なぜこのようにする必要があるかと言うとコンパイラやインタプリタが該当するソースファイル・クラスファイルを発見できるようにするためです。もしディレクトリ構成を無視したファイルの配置がなされている場合、コンパイラは目的のファイルを見つけ出すことができずコンパイルエラーとなってしまいます。

コンパイラとインタプリタはソースファイル・クラスファイルを発見するためにカレントディレクトリとclasses.zipファイル(※1)の検索を行います。パッケージのトップディレクトリ(この場合はcomディレクトリ)を発見した場合、そこから目的のソースファイル・クラスファイルを捜します。パッケージのトップディレクトリがカレントディレクトリやclasses.zipで記載される位置にない場合、CLASSPATH環境変数や-classpathオプション、-sourcepathオプションでトップディレクトリのある位置を指定する必要があります。
(※1) classes.zipファイルはJDK1.0.xとJDK1.1.xのみに含まれます。

【例5】カレントディレクトリにパッケージのトップディレクトリがなく、-classpathオプションを使用して実行する例です。

カレントディレクトリ: D:\JAVA
パッケージ設置ディレクトリ: C:\JAVA\Program
パッケージ名: com.companyA
クラスファイル設置ディレクトリ: C:\JAVA\Program\com\companyA
クラスファイル名: ExPackage3.class

com/companyA/ExPackage3.javaファイル

package com.companyA;  //パッケージcom.companyAの作成

public class ExPackage3 {
    public static void main(String[] args) {
        System.out.println("-classpathオプションで
        パッケージ設置ディレクトリを指定");
    }
}

-classpathオプションを指定した場合

D:\JAVA>javac C:\JAVA\Program\com\companyA\ExPackage3.java
#ExPackage.javaのコンパイル

D:\JAVA>java -classpath C:\JAVA\Program com.companyA.ExPackage3
#-classpathオプションでパッケージ設置ディレクトリを指定して実行

-classpathオプションでパッケージ設置ディレクトリを指定
#実行結果

D:\JAVA>

-classpathオプションを指定しない場合

D:\JAVA>javac C:\JAVA\Program\com\companyA\ExPackage3.java
#ExPackage.javaのコンパイル

D:\JAVA>java com.companyA.ExPackage3
Exception in thread "main"java.lang.NoClassDefFoundError: com/companyA/ExPackage3
#カレントディレクトリにはcom.companyA.ExPackage3クラスファイルがないため、com.companyA.ExPackage3クラスファイル見つからないというエラー

D:\JAVA>

3パッケージの参照