English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
クラスをよりよく整理するために、Javaはパッケージメカニズムを提供し、クラス名のネームスペースを区別するために使用されます。
1、機能が似ているまたは関連するクラスやインターフェースを同じパッケージにまとめることで、クラスの検索と使用を簡単にします。
2、フォルダと同様に、パッケージもツリー構造のディレクトリ方式を用いています。同じパッケージ内のクラス名は異なりますが、異なるパッケージ内のクラス名は同じで、異なるパッケージの同じクラス名を呼び出す場合、パッケージ名を付けることで区別します。したがって、パッケージは名前の衝突を避けることができます。
3、パッケージはアクセス権も制限しており、パッケージアクセス権を持つクラスのみがそのパッケージ内のクラスにアクセスできます。
Javaはパッケージ(package)メカニズムを使用することで、命名上の衝突を防ぎ、アクセス制御を提供し、クラス(class)、インターフェース、エnum、およびコメント(annotation)の検索と定位を行うために使用されます。
パッケージ文の文法形式は以下の通りです:
package pkg1[.pkg2[.pkg3...]];
例えば、Something.javaファイルの内容は以下のようになります
package net.java.util; public class Something{ ... }
その場合、そのパスは以下のようになります net/java/util/Something.java このように保存されます。パッケージ(package)の役割は、異なるjavaプログラムを分類保存し、他のjavaプログラムが簡単に呼び出すようにするものです。
パッケージ(package)は、相互に関連するタイプ(クラス、インターフェース、エnum、およびコメント)のグループを定義し、これらのタイプにアクセス保護およびネームスペース管理の機能を提供します。
以下はJavaのパッケージの例です:
java.lang-基本的なクラスをパッケージ化
java.io-入出力機能を持つ関数
開発者はクラスやインターフェースなどの一組をパッケージにまとめ、自分自身のパッケージを定義することができます。実際の開発ではこれを行うことが推奨されます。クラスの実装が完了した後、関連するクラスをグループ化することで、他のプログラマーがどのクラス、インターフェース、エnum、またはコメントが関連しているかをより簡単に判断することができます。
パッケージは新しいネームスペース(namespace)を生成するため、他のパッケージのどの名前とも命名上の衝突が発生しません。このパッケージメカニズムを使用することで、アクセス制御がより簡単になり、関連するクラスの定位も簡単になります。
パッケージを作成する際には、そのパッケージに適切な名前を付けなければなりません。その後、他のソースファイルがこのパッケージが提供するクラス、インターフェース、エnum、またはコメントタイプを含む場合、このパッケージの宣言をそのソースファイルの先頭に配置する必要があります。
パッケージ宣言はソースファイルの最初の行に記載されるべきであり、各ソースファイルには1つのパッケージ宣言のみが含まれます。このファイルの各タイプはそれに適用されます。
もしソースファイルにパッケージ宣言が使用されていない場合、その中のクラス、関数、エnum、コメントなどは無名のパッケージ(unnamed package)に配置されます。
ここで一例を見てみましょう。この例では、animalsという名前のパッケージを作成しています。通常、クラスやインターフェースの名前と衝突を避けるために小文字の文字で命名します。
animalsパッケージにインターフェース(interface)を追加します:
/* ファイル名: Animal.java */ package animals; interface Animal { public void eat(); public void travel(); }
次に、同じパッケージにこのインターフェースの実装を追加します:
package animals; /* ファイル名 : MammalInt.java */ public class MammalInt implements Animal{ public void eat(){ System.out.println("Mammal eats"); } public void travel(){ System.out.println("Mammal travels"); } public int noOfLegs(){ return 0; } public static void main(String args[]){ MammalInt m = new MammalInt(); m.eat(); m.travel(); } }
次に、これら2つのファイルをコンパイルし、それらをanimalsというサブディレクトリに配置します。 以下のコマンドで実行します:
$ mkdir animals $ cp Animal.class MammalInt.class animals $ java animals/MammalInt Mammal eats Mammal travel
あるパッケージのメンバーを使用するために、Javaプログラム内でそのパッケージを明示的にインポートする必要があります。"import"文を使用してこの機能を実現できます。
Javaのソースファイルでは、import文はpackage文の後に、すべてのクラスの定義の前に配置されるべきです。必要はありませんが、複数のimport文を記述することもできます。その構文形式は以下の通りです:
import package1[.package2...].(classname|*);
パッケージ内で、あるクラスが同じパッケージ内の別のクラスを使用したい場合、そのパッケージ名は省略できます。
以下のpayrollパッケージにはEmployeeクラスが含まれています。次に、payrollパッケージにBossクラスを追加します。BossクラスがEmployeeクラスを参照する場合、payroll接頭辞を使用する必要はありません。Bossクラスの例は以下の通りです。
package payroll; public class Boss { public void payEmployee(Employee e) { e.mailCheck(); } }
もしBossクラスがpayrollパッケージにない場合どうでしょうか?Bossクラスは、他のパッケージのクラスを参照する際に以下の方法のいずれかを使用する必要があります。
クラスの完全な名前を使用して、例えば:
payroll.Employee
用 import キーワードで、ワイルドカード「"を使用します*"
import payroll.*;
を使用します import キーワードでEmployeeクラスを導入します:
import payroll.Employee;
注意:
クラスファイルには、任意の数のimport宣言を含むことができます。import宣言は、パッケージ宣言の後に、クラス宣言の前に配置する必要があります。
クラスをパッケージに配置することで、主に2つの結果が得られます:
パッケージ名は、クラス名の一部となります。これは先ほど議論した通りです。
パッケージ名は、対応するバイトコードが存在するディレクトリ構造と一致する必要があります。
以下は、あなた自身のjavaファイルを管理する簡単な方法です:
クラス、インターフェースなどのタイプのソースコードをテキストファイルに配置し、そのファイル名はそのタイプの名前で、.java拡張子を使用します。例えば:
// ファイル名 : Car.java package vehicle; public class Car { // クラスの実装 }
次に、ソースファイルをクラスが属するパッケージ名に対応するディレクトリに配置します。
....\vehicle\Car.java
今、正しいクラス名とパスは以下のようになります:
クラス名 -> vehicle.Car
パス名 -> vehicle\Car.java (Windowsシステムで)
通常、会社はインターネットドメイン名の逆転形式をパッケージ名として使用します。例えば、インターネットドメイン名が oldtoolbag.com、すべてのパッケージ名は com.w で始まります。3codebox で始まる。パッケージ名の各部分は、子ディレクトリに対応しています。
例えば、以下のようになっています。 com.w3codebox.test のパッケージ、このパッケージには「w」と呼ばれるものが含まれています。3codebox.java のソースファイルがある場合、対応して以下の連続するサブディレクトリがあります。
....\com\w3codebox\test\w3codebox.java
コンパイルの際には、コンパイラはパッケージで定義された各クラス、インターフェースなどに異なる出力ファイルを作成し、出力ファイルの名前はその型の名前で、.class という拡張子が付きます。 例えば:
// ファイル名: w3codebox.java package com.w3codebox.test; public class w3codebox { } class Google { }
今、以下のように使用します:-dオプションでこのファイルをコンパイルします:
$javac -d . w3codebox.java
このようにして、以下のようにコンパイルされたファイルを配置します:
.\com\w3codebox\test\w3codebox.class .\com\w3codebox\test\Google.class
すべてを以下のようにインポートすることができます。 \com\w3codebox\test\ で定義されたクラス、インターフェースなど:
import com.w3codebox.test.*;
コンパイル後の .class ファイルは .java 源ファイルと同じように、配置されるディレクトリはパッケージ名に対応する必要があります。ただし、.class ファイルのパスが対応する .java のパスと同じである必要はありません。ソースコードとクラスのディレクトリを分けて配置することもできます。
<path-one>\sources\com\w3codebox\test\w3codebox.java <path-two>\classes\com\w3codebox\test\Google.class
このようにして、あなたのクラスディレクトリを他のプログラマーに共有することができますが、あなたのソースコードを公開する必要はありません。この方法でソースコードとクラスファイルを管理することで、コンパイラと JVM (JVM) はあなたのプログラムで使用されるすべての型を見つけることができます。
クラスディレクトリの絶対パスは class pathに設定されます。 CLASSPATH の中で。コンパイラと java 虚拟机 (JVM) はパッケージ名を class path に追加することで .class ファイルのパスを構築します。
<path- two>\classes は class path、パッケージ名は com.w3codebox.test、そしてコンパイラと JVM は <path-two>\classes\com\w3codebox\test に .class ファイルを探します。
一つの class path は複数のパスを含む可能性があります。複数のパスは区切り文字で分けます。デフォルトでは、コンパイラと JVM は現在のディレクトリを検索します。JAR ファイルは Java プラットフォームに関連するクラスを含むため、デフォルトで class path に配置されています。
以下のコマンドで現在のCLASSPATH 変数を表示:
Windows プラットフォーム(DOS コマンドラインの下):C:\> set CLASSPATH
UNIX プラットフォーム(Bourne シェルの下):# echo $CLASSPATH
現在のCLASSPATH 変数の内容を削除:
Windows プラットフォーム(DOS コマンドラインの下):C:\> set CLASSPATH=
UNIX プラットフォーム(Bourne シェルの下):# unset CLASSPATH; export CLASSPATH
CLASSPATH 変数の設定:
Windows プラットフォーム(DOS コマンドラインの下):C:\> set CLASSPATH=C:\users\jack\java\classes
UNIX プラットフォーム(Bourne シェルの下):# CLASSPATH=/home/jack/java/classes; export CLASSPATH