パッケージとクラスの完全修飾名

Javaプログラムは「パッケージ」という単位で分類され配置される。


パッケージ (package)

機能的に一まとまりとみなせるJavaソースファイルのグループ。
所属するパッケージはソースファイルの先頭で package宣言 を使って指定する。package宣言の書式は

	package パッケージ名;

である。パッケージを指定しないと「無名パッケージ (デフォルトパッケージ)」に属するとみなされる。

パッケージは単純な一階層だけの名前か、あるいはピリオドで区切られた階層構成になっている。
パッケージの階層構成は実際のファイルシステム中では階層ディレクトリ構造に対応する。

パッケージ名の各階層に使用できる文字は

で、先頭は数字ではいけない。また、Javaの予約語に一致してはいけない。

Javaのパッケージを世界で公開して利用してもらう場合、パッケージ名はインターネットのドメイン名を逆順に並べたものを基にすることが推奨されている。

(例)

ドメイン sys.fit.ac.jp に所属する個人またはグループがJavaパッケージを公開する場合は、パッケージ名として jp.ac.fit.sys あるいはその後にサブパッケージ名をピリオドでつなげたものが推奨される。

クラス Person が パッケージ jp.ac.fit.sys.ap1 にある場合の指定法は以下の通り。

	package jp.ac.fit.sys.ap1;

	public class Person {

		...

	}

実際のファイルシステム中では、クラス Person のファイル (Person.class) はクラスルートのディレクトリから jp\ac\fit\sys\ap1 (Windowsの場合) または jp/ac/fit/sys/ap1 (UNIX系の場合) の相対ディレクトリに置かれる。


クラスの完全修飾名 (完全限定名)

クラスを所属するパッケージも含めて厳密に表現したもの 「パッケージ名.クラス名」 をクラスの完全修飾名 (完全限定名) (fully qualified name)、あるいは簡単に完全名と言う。

これに対して、クラスの名前だけを、クラスの単純名 (simple name) と言う。

クラスは完全修飾名によって特定される。
ただし、同じパッケージの中からは、完全修飾名でなく単純名で指定することができる。

(例)

上の例の Person クラスの完全修飾名は jp.ac.fit.sys.ap1.Person なので、他のクラスから使用するときはそれを使う必要がある。
ただし同じ jp.ac.fit.sys.ap1 パッケージに属するクラスからは、単に Person で指定できる。


import宣言

クラスをすべて完全修飾名で指定していてはわずらわしい。
ソースファイルのpackage指定の後に import宣言 を使って、そのソースファイルで使用するクラスの完全修飾名あるいはその総称を指定すると、クラスを単純名で指定できるようになる。

(例)

上の例の Person クラスを使用する場合、

	import jp.ac.fit.sys.ap1.Person;

を指定すれば、単に Person としてクラスを利用できる。

import宣言 では * を使ってパッケージ内のすべてのクラスを指定できる。

(例)

	import java.util.*;
	import javax.swing.*;

を指定すれば、java.util パッケージおよび javax.swing パッケージに属するすべてのpublicクラスが単純名で利用できる。

	Date d = new Date();	// Date は java.util.Date
	JPanel p = new JPanel();	// JPanel は javax.swing.JPanel

ただし、複数パッケージに同じクラス名がある場合は完全修飾名を使う必要がある。

(例)

上のimport宣言をした場合、単純名 Timer に合致するクラスは

	java.util.Timer
	javax.swing.Timer

の2つがあるため、完全修飾名で指定する必要がある。


暗黙のimport宣言

パッケージ java.lang に属するクラスは import を指定しなくてもすべて単純名で指定できる。つまり、

	import java.lang.*;

が暗黙のうちに宣言されていると考えてよい。

例えば、

	java.lang.String
	java.lang.Integer
	java.lang.Double
	java.lang.Math
	java.lang.System

などは、単に

	String
	Integer
	Double
	Math
	System

として指定できる。

※ ただし、他に同名のクラスを使っていて区別できない場合は完全修飾名を使う必要がある。