10章 パッケージ | |
1.パッケージとは | |
パッケージとはクラスやインターフェースをひとまとめにしたものである。 例えば、ファイルが多くなってくると同じカテゴリのファイルは新しいフォルダを作成してそこに移動して、ファイルを整理する。Javaでも同じようなことができる。つまり、同じカテゴリのクラスやインターフェースは1つのパッケージにしている。 ディレクトリと同じように、パッケージを階層構造にすることもできる。 Javaでは標準で様々なクラスが用意されているが、これらも機能のカテゴリごとに分類され、パッケージ化されている。例えば、ネットワーク関係のクラスは「java.net」というパッケージに各クラスがしまわれている。これは、「java」パッケージという意味になる。そのほかにも「java.util」、「java.lang」など多くのパッケージが用意されている。 |
|
パッケージ | 解説 |
java.lang | Javaの中核を成す機能を担うクラス群 |
java.util | ユーティリティ機能を提供するパッケージ |
java.net | ネットワーク機能を提供するパッケージ |
java.io | 入出力機能を提供するパッケージ |
java.awt | Javaの基本的なGUI機能(AWT:Abstract Window Toolkit)を提供するパッケージ |
java.awt.event | AWTの中でもイベントの機能(ボタンが押された場合など)を提供するパッケージ |
2.パッケージの宣言 | |
あるクラスをあるパッケージに格納するためにはいくつかの手続きが必要になる。一つ目はjavaファイルにパッケージ名を格納すること、二つ目はパッケージ名と同じディレクトリをつくり、そこにjavaファイルを格納することである。 | |
1)Javaファイル(ソースファイル)の最初に | |
package packageName | |
と記述する。 | |
packageNameはパッケージ名をあらわし、例えば下記のように記述する。 | |
// entertainmentパッケージとして定義 package entertainment |
|
// entertainmentパッケージの中のTVパッケージとして定義 package entertainment.TV |
|
2)ディレクトリ | |
パッケージ構成と同じディレクトリを構成する必要がある。つまり、上の例ではentertainmentパッケージとしたjavaファイルは、「entertainment」というディレクトリの中に格納する必要があり、entertainment.TVパッケージとしたjavaファイルは、「entertainment\TV」というディレクトリの中に格納する必要がある。 | |
3)パッケージの指定 | |
異なるパッケージのクラスを指定する場合は、「パッケージ名.クラス名」として参照する。詳しくは下記の例を参照。 | |
4)例 | |
PackageDemo.java
public class PackageDemo{ |
|
testPackage\A.java
// testPackageパッケージとして定義 public class A{ |
|
testPackage\B.java
// testPackageパッケージとして定義 public class B{ System.out.println("b1"); } } |
|
C:\java>javac PackageDemo.java C:\java>java PackageDemo a1 C:\java> |
|
3.クラスパス | |
「entertainment.TV」というクラスを指定した場合、javaは以下のような場所を探す。 | |
1.カレントディレクトリの中の「entertainment」ディレクトリの中のTV.class 2.Javaが標準で用意されているクラス郡の「entertainment」パッケージの中のTV.class |
|
しかし、これだけでは、自分で部品として使えるようにしたクラス群をパッケージとして作成した場合や、便利なパッケージをダウンロードしてきた場合、いちいち自分がこれから作ろうとするディレクトリにすべてコピーしなくてはならなくなる。これでは不便なので、一度部品として切り分けられるようにして作ったパッケージは、ある特定のディレクトリにおいておき、これを指定しておけば、いろいろなプログラムからそのパッケージをいつでも参照することができる。その設定がクラスパスである。 | |
C:\java>set classpath=c:\java\mypackage;c:java\downloadpackage
C:\java>set classpath C:\java> |
|
クラスパスはUNIXやWindowsでは環境変数で設定する。 このように設定すると、javaは |
|
1.カレントディレクトリの中の「entertainment」ディレクトリの中のTV.class 2.c:\mypackage\entertainment\TV.class 3.c:\downloadpackage\entertainment\TV.class 4.Javaが標準で用意されているクラス郡の「entertainment」パッケージの中のTV.class |
|
という手順でTV.classを探しに行く。 | |
4.import | |
testPackageパッケージ内のAクラスを指定するのに「testPackage.A」と記述した。このように「パッケージ.クラス名」と指定する方法を完全修飾名を指定するという。 しかし、この方法は、わざわざパッケージを名をしてしなければならないので面倒である。そこで、あらかじめ「testPackage」を使うとJavaに指定してやれば、わざわざ完全修飾名で指定しなくてもすむ。つまり、C言語でいう「#include」のようなものである。Javaでは「#include」ではなく「import」というステートメントを使用する。 importはjavaファイルのはじめに記述し、そのjava内で使用するクラスをimportの後に、「パッケージ名.クラス名」の形式で宣言する。そのパッケージ内のすべてのクラスを宣言したい場合は、クラス名を「*」として指定する。まだ、複数のパッケージを指定することもでき、その場合はimport行を何行も列挙する。 以下に例を示す。左側は完全修飾名を指定して記述した場合で、右側はimportを使用して、使用するパッケージを宣言した例である。以下の二つの例は同じになる。 |
|
PackageDemo.java
public class PackageDemo{ |
PackageDemo.java
import testPackage.*; public class PackageDemo{ |
testPackage\B.java
// testPackageパッケージとして定義 public class B{ |
|
C:\java>javac PackageDemo.java
C:\java>java PackageDemo C:\java> |
|