学習雑記11 JAVA

パッケージのまとめ

 カレントディレクトリでクラスを実行する時にコンパイルはできるのにロードできないなんてことがある。ソースファイルを読むからコンパイルはできるけど、クラスは完全修飾クラス名でないと扱われない、実行時のカレントディレクトリなど、理解よりも慣れが必要な印象を受けたため、まとめておく。

 

package:

 クラスをまとめるための概念で、どのパッケージに属しているかをpackage宣言で最初に行う。(package宣言より前に記述できるのはコメントだけ)

 完全修飾クラス名を省略して、クラス名だけで記述できるようになる(import宣言)

 完全修飾クラス名に一致したディレクトリ構造

 

完全修飾クラス名:

 パッケージ名+クラス名(長い、+は実際にはコンマで繋ぐ)

 ドメインは世界で1つであることが保証された仕組みであることから、ドメイン名を逆にしたものを使うことで、他で作ったクラスと重複しないようにする慣例がある。ドメイン名を使用するので、異様に長くなる。

 オブジェクト型のインスタンスを作成するときなどはimport宣言が無ければ、とても読みにくい。

jp.co.xxxxxx.SampleProject.TestFunction.Sample sample 

          = new jp.co.xxxxxx.SampleProfcet.TestFunction.Sample();

上記を、 Sample sample = new Sample(); とクラス名だけで記述することができます。

 

import宣言:

 コンパイラJVMは完全修飾クラス名でしかクラスを使えないが、長い上に可読性がよくないので、import宣言をしておくことによってクラス名だけで使えるようになる

 アスタリスクをクラス名の部分にワイルドカードとして指定できる。この場合、パッケージに属する全てのクラスが対象となり、使えるようになる。

 

無名package:

 デフォルトでパッケージ宣言をしない時にこの扱いになります。

 他のパッケージからはアクセスできないようになっている。

 

パッケージとファイルの対応:

 ソースファイル名はクラス名に拡張子javaが必要

 コンパイラJVMは完全修飾クラス名でしかクラスを扱えない

 完全修飾クラスjp.co.xxxxx.Sampleに一致したディレクトリ構造とは、jpディレクトリ配下にcoディレクトリがあり、その配下にxxxxxディレクトリがあり、さらにその下にSampleディレクトリがある階層構造をいいます。

 

クラスパス:

 コンパイラJVMがクラスファイルを探すために示す場所で、複数の階層構造を包括する一番トップのディレクトリがある必要があるため。

 クラスパスの指定にはコンパイル時にはjavacコマンドに、実行時にはjavaコマンドに-cpオプションをつける

 java sample.Testは、カレントディレクトリ配下のsampleディレクトリの中にあるTestクラスを実行するという意味になる。sampleディレクトリがカレントディレクトリでは読み込めないエラーが出てしまう。

 

-cp オプションなど

 -cpのあとはスペースが必要

 コンパイル前に探しに行く、ディレクトリの場所を指定できる

> javac -cp ..¥..¥SampleA¥classes sample¥Test.java

カレントディレクトリから2つ上階層のディレクトリの配下にあるSampleAディレクトリ直下のclassesを指定しています。

> java -cp ..¥..¥SampleA¥classes;. sample.Test

複数の場所をクラスパスに指定するにはセミコロンで区切って列挙する

コンマはカレントディレクトリを示す

ここではカレントディレクトリと、カレントディレクトリから2つ上のSampleA¥classesを指定しています。

 

アクセス制御とアクセス修飾子:

修飾子 UML 意味
public + 全てのクラスから利用可能
protected # サブクラス、同じパッケージのクラスは利用可能
なし(default) ~ 同じパッケージのクラスは利用可能
private - 同じクラスのみ利用可能

 

package外から非公開したいクラスは、同じパッケージに属する公開しても良いクラスから使われるように宣言する