Revised: Jan./1st/2002: Since: Jan./1st/2002
パッケージと言う仕組みのメリットに、クラス名の競合の解決が挙げられます。異なるパッケージでなら、同じクラス名が存在しても良いということです。そのため、クラスの識別の為には、そのクラスが属するパッケージまで含めて指定する必要があります。この識別名を、完全限定名 (fully qualified name) と呼びます。
java.langパッケージに属するクラスIntegerは、java.lang.Integerと書きます。このようにパッケージ名まで含めたクラス名を完全限定名と呼びます。通常は、完全限定名でクラスを指定します。但し、java.langパッケージだけは例外で、パッケージ名を指定しないでも自動的に探されます。
例えば、java.ioパッケージにInputStreamReaderクラスがあります。これを使うときは、単にInputStreamReaderと書くのではなく、完全限定名java.io.InputStreamReaderで指定する必要があります。同じく、BufferedReaderはjava.io.BufferedReaderと書く必要があります。
例えば、次のクラスを利用したいとします:
java.lang.Object | +--java.util.Date
通常ならば、ソースの冒頭で import
します:
import java.util.Date;
class TestDate {
public static void main(String args[]) {
Date obj = new Date();
System.out.println("現在時刻:" + obj);
}
}
これは次のようにも書けます:
class TestDate { public static void main(String args[]) { java.util.Date obj = new java.util.Date(); System.out.println("現在時刻:" + obj); } }
前者の例では、 import
することによって、クラス名だけで識別できましたが、後者では完全限定名を明記して識別しています。
java.lang
パッケージ例えば、全てのクラスで自動的にインポートされる java.lang
パッケージには、 System
クラスが定義されています。このクラスの完全限定名は java.lang.System
です。原則どおりであれば、このクラスを識別する為には、完全限定名 java.lang.System
を記述する必要があります。 "System
" だけで識別できる理由は、 java.lang
パッケージに含まれる全てのクラスが、コンパイル時に自動的に import
されるからです。
自分でクラス TestClass
の先頭でパッケージ宣言を記述したとします。
package java.usr;
このクラスの完全限定名は java.usr.TestClass
になります。
パッケージ名をイチイチ記述するのが面倒なので、クラス名だけで利用できるようにする仕組み、即ちクラス名を完全限定名に解決する為の仕組みがインポートです。完全限定名はインポート文で明示されているので、クラス名だけでも容易に完全限定名に解決されるわけです。
明示的にクラス名が指定されたインポート文での完全限定名解決は容易であり、ワイルドカード *
を利用したインポート文でも、指定されたパッケージに登録されているクラス名がサーチされることで解決します。
package tool.packA; class PackTest { public static void main(String rags[]) { System.out.println("This is tool.packA.PackTest."); } }
CLASSPATH が設定されていないとき、カレントディレクトリ C:\Java
から相対パス "./tool/packA/PackTest.java
" であったとします。このとき、コンパイルは次のように出来ます:
C:\Java\>javac tool\packA\PackTest.java
勿論、カレントを C:\Java\tool\packA
まで移動してからクラス名だけ指定してコンパイルしても問題なく実行できます。
また、インタープリタ java
の引数に完全限定名で指定することもできます:
C:\Java>java tool.packA.PackTest This is tool.packA.PackTest.