Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > Java基本 > パッケージ −2.パッケージの作成
更新日:2005/7/28
パッケージ−2.パッケージの作成
このページではパッケージの作成方法について説明します。
パッケージの作成方法
パッケージの作成は以下の枠内のフォーマットにより構成されます。パッケージに含めたいクラス・インタフェースが定義されているソースファイルの先頭でpackage文を宣言します。パッケージのスコープはソースファイル全体になります。そのため、ソースファイルにクラス・インタフェースが複数書かれている場合はそれらすべてがパッケージに含まれます。
package パッケージ名;

【例1】

//クラスExPackageをパッケージPackageAに含めます。
package PackageA;

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

ソースファイル作成時、packageを宣言しない場合、そのソースファイルで宣言されたクラス・インタフェースはデフォルトパッケージに含まれます。デフォルトパッケージとは名前を持たないパッケージを言います。デフォルトパッケージは非常に小規模なプログラムや開発環境で使われるものです。プログラムを体系的に整理するためにも各ソースファイルの先頭でpackage文を宣言することが推奨されます。

パッケージのネーミング規則
プログラムの配布を考える時、そのプログラムで宣言されているパッケージ名が他のプログラムのパッケージ名と重複しないとは限りません。パッケージ名が重複してしまうとせっかくのパッケージの利点であるクラス名、インターフェース名の重複排除が侵害されてしまいます。

パッケージ名が重複しないようにネーミング規則の慣例があります。プログラマが属する会社や組織のインターネットドメイン名を使用すると言うものです。例えば、ある会社のドメイン名がAAA.co.jpであるとパッケージ名はjp.co.AAA.packageAなどとなります。

独自ドメインを持っていない場合は以下のURLからパッケージ名の登録を行うことができます。
http://www.java-conf.gr.jp/wg_bof/package/
パッケージのアクセスレベル
クラス、メンバ変数、メソッド、コンストラクタにアクセスレベルを付与することにより、パッケージ外からのアクセスを制限することができます。セキュリティを考慮し、必要でない場合以外はパッケージ外からのアクセスを制限すべきです。

クラス
publicアクセスレベルが付与されている場合のみ、そのクラスをパッケージ外から使用できます。デフォルト(無指定)の場合、パッケージ外からは使用できません。

メンバ変数、メソッド、コンストラクタ
publicアクセスレベルが付与されている場合のみ、パッケージ外から使用できますがprotected、デフォルト(無指定)、privateアクセスレベルが付与されている場合、パッケージ外からは使用できません。
※protectedアクセスレベルはサブクラスからは、パッケージ外からでも使用可能です。 詳細はアクセスレベルを参照してください。

【例2】publicでないクラスをパッケージ外から使用できない例です。
PackageA/ExPackage2A.javaファイル

package PackageA;  //(1)パッケージPackageAの定義

class ExPackage2A { //(2)publicでないクラスExPackage2Aの定義
  public void showClass() {
    System.out.println("クラスExPackage2Aです。");
  }
}

PackageB/ExPackage2B.javaファイル

package PackageB;  //(3)パッケージPackageBの定義

import PackageA.ExPackage2A;  //(4)

public class ExPackage2B {  //(5)
  public static void main(String[] args) {
    ExPackage2A ex = new ExPackage2A();  //(6)
    ex.showClass();
  }
}

【解説2】

(1). パッケージPackageAを定義します。
(2). publicアクセスレベルが付与されないクラスExPackage2Aを定義します。
(3). パッケージPackageBを定義します。
(4). PackageAに属するExPackage2Aクラスをインポートします。
(5). クラスExPackage2Bを定義します。
(6). クラスExPackage2Aのオブジェクトexを生成します。
【実行結果2】
D:\JAVA>javac PackageB/ExPackage2B.java
PackageB/ExPackage2B.java:3: PackageA の PackageA.ExPackage2A は public ではあり ません。パッケージ外からはアクセスできません。
import PackageA.ExPackage2A;
            ^
PackageB/ExPackage2B.java:7: PackageA の PackageA.ExPackage2A は public ではあり ません。パッケージ外からはアクセスできません。
  ExPackage2A ex = new ExPackage2A();
   ^
PackageB/ExPackage2B.java:7: PackageA の PackageA.ExPackage2A は public ではあり ません。パッケージ外からはアクセスできません。
  ExPackage2A ex = new ExPackage2A();
   ^
PackageB/ExPackage2B.java:7: PackageA.ExPackage2A の ExPackage2A() は public で はありません。パッケージ外からはアクセスできません。
  ExPackage2A ex = new ExPackage2A();
   ^
PackageB/ExPackage2B.java:8: PackageA.ExPackage2A の showClass() は public クラ スまたはインタフェースでは定義されません。パッケージ外からはアクセスできません。
   ex.showClass();
    ^
エラー 5 個

D:\JAVA>

【例3】publicクラスをパッケージ外からでも使用できる例です。
PackageA/ExPackage2A.javaファイル

package PackageA;  //(1)パッケージPackageAの定義

public class ExPackage2A { //(2)publicなクラスExPackage2Aの定義
  public void showClass() {
    System.out.println("クラスExPackage2Aです。");
  }
}

PackageB/ExPackage2B.javaファイル

package PackageB;  //(3)パッケージPackageBの定義

import PackageA.ExPackage2A;  //(4)

public class ExPackage2B {  //(5)
  public static void main(String[] args) {
    ExPackage2A ex = new ExPackage2A();  //(6)
    ex.showClass();  //(7)
  }
}

【解説3

(1). パッケージPackageAを定義します。
(2). publicアクセスレベルが付与されたクラスExPackage2Aを定義します。
(3). パッケージPackageBを定義します。
(4). PackageAに属するExPackage2Aクラスをインポートします。
(5). クラスExPackage2Bを定義します。
(6). クラスExPackage2Aのオブジェクトexを生成します。
(7). クラスExPackage2AのshowClassメソッドを実行します。
【実行結果3】
D:\JAVA>javac PackageB/ExPackage2B.java

D:\JAVA>java PackageB/ExPackage2B
クラスExPackage2Aです。

D:\JAVA>
パッケージ
1.はじめてのパッケージ
2.パッケージの作成
3.パッケージの参照



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道