明解Java入門編 第11章まとめ
パッケージ
主な役割は3つ
1.名前の衝突回避
2.カテゴリによる分類
3.カプセル化(アクセス制御)
同一名のクラスは異なるパッケージに属していれば使い分けられる。
階層化できる。例)Scannerクラスはjavaパッケージの中のutilパッケージに属す。
階層的なパッケージの名前は各パッケージ名を.で区切って表現することになっている。例)java.util
完全限定名
例)java.util.Scanner
単純名
例)Scanner
型インポート宣言
パッケージ名を省略した単純名だけで型を利用可能にする。2種類ある。
単一型インポート宣言
import 完全限定名;
この形式でインポートされた型名はそのソースプログラム内で単純名だけで利用できる。
オンデマンド型インポート宣言
ソースファイル中で利用する全クラスに対して単一型インポート宣言を行うのは大変。そのための簡略的なインポート方法。
import パッケージ名.*;
パッケージ名で指定されたパッケージに所属する型名を、単純名だけで利用できる。
オンデマンドは「必要に応じて」という意味なので使われていない型名はインポートされない。
オンデマンド型インポートするパッケージに同一名のクラスが存在するとそのクラスを単純名で利用しようとしたときエラーが生じるのでオンデマンド型インポート宣言は多用すべきではない。
異なる階層のパッケージ中の型名はインポートできない。
java.langパッケージの自動インポート
java言語に密接に関連したクラスが集められているので、自動的にインポートされることになっている。
静的インポート宣言
・クラス変数(静的フィールド)
・クラスメソッド(静的メソッド)
の2つのインポートを行う。
単一静的インポート宣言
import static 型名.識別子名;
オンデマンド静的インポート宣言
import static 型名.*;
特定のクラスに所属するクラス変数またはクラスメソッドを多用するプログラムでは、オンデマンド静的インポート宣言をするとよい。
パッケージ宣言
package パッケージ名;
・パッケージ宣言はなくてもよい
・パッケージ宣言を2個以上置くことはできない
同一のパッケージ内に所属するクラスは、単純名でアクセスできる。
無名パッケージ
ソースファイルにパッケージ宣言がない場合、そのソースファイル中で定義したクラスは無名パッケージに所属することになっている。無名パッケージに所属するクラスの完全限定名は、単純名と一致する。テスト的な使い捨てのものでない限り、クラスはパッケージに所属させるべきである。
パッケージとクラスの命名での注意
一つのパッケージ中に同一名のパッケージとクラスが存在することは許されない。
パッケージ名はすべて小文字とする。
パッケージとディレクトリ
パッケージを作成する場合は、パッケージ名と同一のディレクトリの中にソースファイルとクラスファイルを置くのが基本的構成である。
一意なパッケージ名
パッケージには一意な名前を与える必要がある。
推奨されているのはインターネットのアドレスを逆順に並べるという方法。識別子として許されていないハイフンなどの特殊文字は下線文字に置き換える。キーワードと一致する単語にはその後ろに下線文字を付加する。先頭文字が識別子の開始文字として許されていない場合はその単語の前に下線文字を付加する。
クラスのアクセス制御
クラスのアクセス性はパッケージという観点から2種類に分けられる。
publicクラス
キーワードpublic付きで宣言されたクラス
パッケージとは無関係に利用できる。
クラスのアクセス性は公開アクセスになる。
publicクラスの名前とソースプログラムのファイルの名は一致していなければならない。
1個のソースプログラムにはpublicなクラスを0個または1個しか定義できない。
非publicクラス
キーワードpublicを付けずに宣言されたクラス
そのクラスが所属するパッケージ内からは利用できるが、他のパッケージからは利用できない。
クラスのアクセス性はパッケージアクセスとなる。(デフォルトアクセスとも呼ばれる)
メンバのアクセス制御
あるクラスに所属するクラス変数・インスタンス変数・メソッドなどをまとめてクラスのメンバと呼ぶ。
メンバのアクセス性には4種類ある。
公開(public)アクセス
パッケージの中からも外からも利用できる
限定公開アクセス
パッケージの中からのみ利用できる
パッケージアクセスと違い、パッケージの内部からだけでなく、そのクラスから派生した異なるパッケージに属するサブクラスからも利用できる
パッケージアクセス
同じパッケージの中からのみ利用できる
非公開(private)アクセス
クラスの内部でのみ利用できる
同じパッケージに所属するクラスからは利用できない