Java-packages

提供:Dev Guides
移動先:案内検索

Java-パッケージ

パッケージは、名前の競合を防ぎ、アクセスを制御し、クラス、インターフェイス、列挙、および注釈の検索/検索と使用を容易にするために、Javaで使用されます。

*Package* は、アクセス保護と名前空間管理を提供する関連するタイプ(クラス、インターフェース、列挙、および注釈)のグループとして定義できます。

Javaの既存のパッケージのいくつかは-

  • java.lang -基本クラスをバンドル
  • java.io -入力、出力関数のクラスはこのパッケージにバンドルされています

プログラマは独自のパッケージを定義して、クラス/インターフェースなどのグループをバンドルできます。 プログラマーがクラス、インターフェイス、列挙、および注釈が関連していることを簡単に判断できるように、ユーザーが実装した関連クラスをグループ化することをお勧めします。

パッケージは新しい名前空間を作成するため、他のパッケージの名前と名前が競合することはありません。 パッケージを使用すると、アクセス制御を提供しやすくなり、関連するクラスを見つけやすくなります。

パッケージを作成する

パッケージの作成中に、パッケージの名前を選択し、クラスに含まれるクラス、インターフェイス、列挙、および注釈タイプを含むすべてのソースファイルの先頭に package ステートメントとその名前を含める必要がありますパッケージ。

パッケージステートメントは、ソースファイルの最初の行である必要があります。 各ソースファイルに含めることができるパッケージステートメントは1つだけであり、ファイル内のすべてのタイプに適用されます。

パッケージ文が使用されない場合、クラス、インターフェース、列挙、および注釈タイプは現在のデフォルトパッケージに配置されます。

パッケージ文を使用してJavaプログラムをコンパイルするには、以下に示すように-dオプションを使用する必要があります。

javac -d Destination_folder file_name.java

次に、指定されたパッケージ名のフォルダーが指定された宛先に作成され、コンパイルされたクラスファイルがそのフォルダーに配置されます。

*animals* というパッケージを作成する例を見てみましょう。 クラスとインターフェースの名前との競合を避けるために、小文字のパッケージ名を使用することをお勧めします。

次のパッケージ例には、_animals_という名前のインターフェイスが含まれています-

/*File name : Animal.java*/
package animals;

interface Animal {
   public void eat();
   public void travel();
}

さて、同じパッケージ_animals_に上記のインターフェースを実装しましょう-

package animals;
/*File name : 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();
   }
}

次に示すように、Javaファイルをコンパイルします-

$ javac -d . Animal.java
$ javac -d . MammalInt.java

これで、 animals という名前のパッケージ/フォルダーが現在のディレクトリに作成され、以下に示すようにこれらのクラスファイルがその中に配置されます。

パッケージ

パッケージ内でクラスファイルを実行し、次のように結果を取得できます。

Mammal eats
Mammal travels

インポートキーワード

クラスが同じパッケージ内の別のクラスを使用する場合、パッケージ名を使用する必要はありません。 同じパッケージ内のクラスは、特別な構文なしでお互いを見つけます。

ここでは、既にEmployeeを含むBossという名前のクラスが給与パッケージに追加されます。 ボスは、次のボスクラスで示すように、給与のプレフィックスを使用せずにEmployeeクラスを参照できます。

package payroll;
public class Boss {
   public void payEmployee(Employee e) {
      e.mailCheck();
   }
}

従業員クラスが給与パッケージにない場合はどうなりますか? Bossクラスは、異なるパッケージ内のクラスを参照するために、次のいずれかの手法を使用する必要があります。

  • クラスの完全修飾名を使用できます。 たとえば-
payroll.Employee
  • importキーワードとワイルドカード(*)を使用して、パッケージをインポートできます。 たとえば-
import payroll.*;
  • importキーワードを使用して、クラス自体をインポートできます。 たとえば-
import payroll.Employee;

-クラスファイルには、インポートステートメントをいくつでも含めることができます。 インポートステートメントは、パッケージステートメントの後、クラス宣言の前に表示する必要があります。

パッケージのディレクトリ構造

クラスがパッケージに配置されている場合、2つの主要な結果が発生します-

  • 前のセクションで説明したように、パッケージの名前はクラスの名前の一部になります。
  • パッケージの名前は、対応するバイトコードが存在するディレクトリ構造と一致する必要があります。

Javaでファイルを管理する簡単な方法を次に示します-

クラス、インターフェイス、列挙、または注釈タイプのソースコードを、名前がタイプの単純名で拡張子が .java のテキストファイルに入れます。

たとえば-

//File Name :  Car.java
package vehicle;

public class Car {
  //Class implementation.
}

今、クラスが属するパッケージの名前を反映した名前を持つディレクトリにソースファイルを置きます-

....\vehicle\Car.java

今、修飾クラス名とパス名は次のようになります-

  • クラス名→vehicle.Car
  • パス名→vehicle \ Car.java(Windows)

一般に、企業はパッケージ名に逆インターネットドメイン名を使用します。

-会社のインターネットドメイン名はapple.comであり、すべてのパッケージ名はcom.appleで始まります。 パッケージ名の各コンポーネントは、サブディレクトリに対応しています。

-Dell.javaソースファイルを含むcom.apple.computersパッケージがあり、このような一連のサブディレクトリに含まれます-

....\com\apple\computers\Dell.java

コンパイル時に、コンパイラは、クラス、インターフェイス、および列挙で定義されている各列挙に対して異なる出力ファイルを作成します。 出力ファイルのベース名はタイプの名前で、拡張子は .class です。

たとえば-

//File Name: Dell.java
package com.apple.computers;

public class Dell {
}

class Ups {
}

-dオプションを使用して、このファイルを次のようにコンパイルします-

$javac -d . Dell.java

ファイルは次のようにコンパイルされます-

.\com\apple\computers\Dell.class
.\com\apple\computers\Ups.class

次のように_ \ com \ apple \ computers \ _で定義されているすべてのクラスまたはインターフェイスをインポートできます-

import com.apple.computers.*;

javaソースファイルと同様に、コンパイルされた.classファイルは、パッケージ名を反映する一連のディレクトリにある必要があります。 ただし、.classファイルへのパスは、.javaソースファイルへのパスと同じである必要はありません。 次のように、ソースディレクトリとクラスディレクトリを別々に配置できます-.

<path-one>\sources\com\apple\computers\Dell.java

<path-two>\classes\com\apple\computers\Dell.class

これを行うことにより、ソースを公開せずにクラスディレクトリへのアクセスを他のプログラマに与えることができます。 また、コンパイラとJava仮想マシン(JVM)がプログラムが使用するすべてのタイプを見つけることができるように、この方法でソースファイルとクラスファイルを管理する必要があります。

クラスディレクトリへのフルパス<path-two> \ classesはクラスパスと呼ばれ、CLASSPATHシステム変数で設定されます。 コンパイラーとJVMは両方とも、パッケージ名をクラスパスに追加することにより、.classファイルへのパスを作成します。

<path-two> \ classesがクラスパスであり、パッケージ名がcom.apple.computersである場合、コンパイラとJVMは<path-two> \ classes \ com \ apple \ computersで.classファイルを探します。

クラスパスには複数のパスが含まれる場合があります。 複数のパスは、セミコロン(Windows)またはコロン(Unix)で区切る必要があります。 デフォルトでは、コンパイラとJVMは現在のディレクトリとJavaプラットフォームクラスを含むJARファイルを検索し、これらのディレクトリが自動的にクラスパスに含まれるようにします。

CLASSPATHシステム変数を設定する

現在のCLASSPATH変数を表示するには、WindowsおよびUNIX(ボーンシェル)で次のコマンドを使用します-

  • Windowsの場合:C:\> CLASSPATHを設定します
  • UNIXの場合→%echo $ CLASSPATH

CLASSPATH変数の現在の内容を削除するには、次を使用します-

  • Windows→C:\> CLASSPATH =を設定します
  • UNIXの場合→%unset CLASSPATH; CLASSPATHをエクスポート

CLASSPATH変数を設定するには-

  • Windowsの場合→CLASSPATH = C:\ users \ jack \ java \ classesに設定します
  • UNIXの場合→%CLASSPATH =/home/jack/java/classes; CLASSPATHをエクスポート