Javaパッケージ


クラスをより適切に編成するために、Java はクラス名の名前空間を区別するパッケージ メカニズムを提供します。

パッケージの役割

  • 1 クラスの検索と使用を容易にするために、類似または関連する機能を持つクラスまたはインターフェイスを同じパッケージに編成します。

  • 2 フォルダーと同様に、パッケージもツリー ディレクトリに保存されます。同じパッケージ内のクラスの名前は異なりますが、異なるパッケージ内のクラスの名前は同じであってもかまいません。2 つの異なるパッケージ内の同じクラス名のクラスを同時に呼び出す場合は、区別するためにパッケージ名を追加する必要があります。彼ら。したがって、パッケージは名前の競合を回避できます。

  • 3 パッケージは、アクセス権限も制限します。パッケージ アクセス権限を持つクラスのみが、特定のパッケージ内のクラスにアクセスできます。

Java はパッケージメカニズムを使用して、名前の競合を防ぎ、アクセス制御を行い、クラス、インターフェース、列挙型、注釈などの検索と場所を提供します。

package ステートメントの構文形式は次のとおりです:

package pkg1[.pkg2[.pkg3…]];

たとえば、Something.java ファイルの内容が

package net.java.util
public class Something{
   ...
}

の場合、そのパスは net/java/util/Something.java のように保存する必要があります。パッケージの機能は、さまざまな Java プログラムを分類して保存し、他の Java プログラムからより便利に呼び出せるようにすることです。

パッケージは、相互接続された型 (クラス、インターフェイス、列挙、および注釈) のセットとして定義でき、これらの型にアクセス保護と名前空間管理機能を提供します。

以下は Java のいくつかのパッケージです:

  • java.lang - 基本クラスをパッケージします

  • java.io - 入出力関数が含まれています

開発者はクラスとインターフェースのセットを自分で配置できますパッケージ化を待って、独自のパッケージを定義します。実際の開発でこれを行うことを推奨する価値があります。クラスの実装を自分で完了した後、関連するクラスをグループ化すると、他のプログラマがどのクラス、インターフェイス、列挙、アノテーションなどに関連しているかを判断しやすくなります。

パッケージは新しい名前空間を作成するため、他のパッケージの名前と名前の競合が発生することはありません。パッケージメカニズムを使用すると、アクセス制御の実装が容易になり、関連するクラスを見つけやすくなります。


パッケージの作成

パッケージを作成するときは、パッケージに適切な名前を付ける必要があります。後で、別のソース ファイルにこのパッケージによって提供されるクラス、インターフェイス、列挙型、または注釈型が含まれる場合は、パッケージ宣言をソース ファイルの先頭に配置する必要があります。

パッケージ宣言はソース ファイルの最初の行に置く必要があります。パッケージ宣言はソース ファイルごとに 1 つだけ存在し、このファイル内のすべての型が適用されます。

ソース ファイルでパッケージ宣言が使用されていない場合、クラス、関数、列挙、注釈などは名前のないパッケージに配置されます。

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

animals パッケージにインターフェースを追加します:

/* 文件名: 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

import キーワード

特定のパッケージのメンバーを使用するには、Java プログラムにパッケージを明示的にインポートする必要があります。この機能は、「import」ステートメントを使用して実行できます。

Java ソース ファイルでは、import ステートメントは package ステートメントの後、すべてのクラスの定義の前に配置する必要があります。構文形式は次のとおりです。

import package1[.package2…].(classname|*);

パッケージ内の場合、クラスは必要になります。パッケージ内の別のクラスを使用する場合は、パッケージ名を省略できます。

次の給与パッケージにはすでに Employee クラスが含まれています。 次に、給与パッケージに Boss クラスを追加します。 Boss クラスは、Employee クラスを参照するときに payroll プレフィックスを使用する必要はありません。 Boss クラスの例は次のとおりです。

package payroll;

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

Boss クラスが給与パッケージに含まれていない場合はどうなりますか? 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

これで、正しいクラス名とパスは次のようになります:

  • class name-> vehicle.Car

  • path name-> vehicleCar.java (Windows の場合)

たとえば、インターネット ドメイン名が apple.com の場合、すべてのパッケージ名は com.apple で始まります。パッケージ名の各部分はサブディレクトリに対応します。

例: この会社には com.apple.computers パッケージがあり、このパッケージには Dell.java という名前のソース ファイルが含まれています。これに応じて、次のような一連のサブディレクトリが存在します。 、インターフェイスなど、パッケージで定義されているタイプは、別の出力ファイルを作成します。出力ファイルの名前は、拡張子の接尾辞として .class を付けたタイプの名前になります。 例:

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

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

// 文件名: Dell.java

package com.apple.computers;
public class Dell{
      
}
class Ups{
      
}

これにより、コンパイルされたファイルは次のように配置されます:

$javac -d . Dell.java

compapplecomputers で定義されているすべてのクラス、インターフェイスなどを次のようにインポートできます:

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

コンパイルされた .class ファイルは .java ソース ファイルと同じである必要があり、それらが配置されるディレクトリは、その包み。ただし、.class ファイルのパスが、対応する .java のパスと同じである必要はありません。ソースディレクトリとクラスディレクトリを別々に配置できます。

import com.apple.computers.*;

このようにして、ソース コードを公開することなく、クラス ディレクトリを他のプログラマと共有できます。この方法でソース コードとクラス ファイルを管理すると、コンパイラと Java 仮想マシン (JVM) がプログラムで使用されているすべての型を検索できるようになります。

クラスディレクトリの絶対パスをクラスパスと呼びます。システム変数 CLASSPATH に設定します。コンパイラと Java 仮想マシンは、クラス パスにパッケージ名を追加することによって、.class ファイルへのパスを構築します。

<path-two>classes はクラスパス、パッケージ名は com.apple.computers で、コンパイラと JVM は <path-two>classescomapplecompters で .class ファイルを見つけます。

クラスパスには複数のパスが含まれる場合があります。複数のパスは区切り文字で区切る必要があります。デフォルトでは、コンパイラと JVM は現在のディレクトリを検索します。 JAR ファイルには Java プラットフォームに関連するクラスが含まれているため、そのディレクトリはデフォルトでクラスパスに配置されます。


CLASSPATH システム変数を設定します

次のコマンドを使用して、現在の CLASSPATH 変数を表示します:

  • Windows プラットフォーム (DOS コマンド ライン下) -> C:> CLASSPATH を設定します

  • UNIX プラットフォーム (Bourne シェルの下) -> % echo $CLASSPATH

現在の CLASSPATH 変数の内容を削除します:
  • Windows プラットフォーム (DOS コマンド ライン下) -> C:> CLASSPATH=

  • UNIX プラットフォーム (Bourne シェル下) -> % CLASSPATH の設定を解除します

CLASSPATH 変数を設定します:

  • Windows プラットフォーム (DOS コマンド ライン下) -> CLASSPATH=C:usersjackjavaclasses

  • UNIX プラットフォーム (Bourne シェルの下) -> % CLASSPATH=/home/jack/java/classes;