1. パッケージ

通常の Java プログラムには膨大な数のクラスが含まれます。幾つか?何千、何万。また、プログラムが他のプログラマによって作成されたクラスを含むさまざまなライブラリを使用しているという事実も考慮に入れると、クラスの数は簡単に数百万単位になるでしょう。

これら数百万、あるいは数千のクラスすべてに一意の名前を付けることは、ほとんど不可能です。

もちろん、A123や のような名前を想像することはできB345ますが、クラスを理解しやすくする適切なクラス名 (たとえば、String文字列など) を選択することについて話している場合、1,000 個の一意の名前を生成するだけでも大変です。仕事の。

このため、Java では、package キーワードを使用してクラスをパッケージにグループ化するのが一般的です。

Java クラスとそのパッケージは、コンピュータ上のファイルやフォルダに非常に似ています。

たとえば、コンピュータに 10 個のドキュメントを保存する必要がある場合、おそらくそれらを 1 つのフォルダに保存するだけでしょう。しかし、何千ものドキュメント (たとえば、会社のすべてのドキュメントのリポジトリ) がある場合はどうなるでしょうか?

何千ものドキュメントを保存する必要がある場合、解決策の 1 つは、わかりやすい名前を付けて複数のレベルのフォルダーを作成することです。そして、最後のレベルのフォルダーに、その特定のフォルダーに関連するドキュメントを保存します。ドキュメントにわかりやすい名前を付けても問題ありません。

実際、これらすべてを Java のクラスに対して行います。

クラスを含むファイルは別のディレクトリ (フォルダー) に保存され、クラスのフォルダーとそのすべてのサブフォルダーの完全な名前がパッケージの名前になります。例:

ファイルへのパス パッケージ名 クラス名
\com\codegym\tasks\Solution.java
com.codegym.tasks
Solution
\com\io\FileInputStream.java
com.io
FileInputStream
\java\util\ArrayList.java
java.util
ArrayList

フォルダー名とは異なり、パッケージ名では区切り文字としてドットが使用されます。つまり、フォルダーがパッケージ\com\codegym\tasks\に相当しますcom.codegym.tasks


2.srcフォルダー

Java では、プログラムのすべてのクラスを 1 つのフォルダー (およびサブフォルダー) に保存するのが一般的です。このフォルダーは通常src( sourceの略) と呼ばれます。

このフォルダーはプロジェクト ルート (またはソース ルート) と呼ばれ、すべてのパッケージ パスはそれに対する相対パスになります。例:

フォルダー パッケージ名
c:\projects\data\my\src\com\codegym\tasks\
com.codegym.tasks
d:\files\git\data\project\src\com\codegym\tasks\
com.codegym.tasks

この状況では、プログラマーは、「フォルダー内に という名前のプロジェクトがありmyます」または「フォルダー内に というc:\projects\data名前のプロジェクトがあります」などと言います。projectd:\files\git\data

クラスはルート フォルダー ( ) に直接置くのではなく、常にパッケージ内に置くのが最善ですsrcクラスが数個しかない場合、これは問題になりません。しかし、クラスが多数ある場合、非常に混乱しやすくなります。 、クラスは常にパッケージ内でのみ作成してください。

Java では、クラスやパッケージに意味のある名前を付けるのが通例です。多くの企業は独自のライブラリ (クラスのセット) をリリースしており、混乱を避けるために、パッケージ名に企業/Web サイト/プロジェクトの名前を組み込んでいます。

パッケージ名 会社名・プロジェクト名
org.apache.common
org.apache.tomcat
org.apache.util
アパッチプロジェクト
com.oracle.jdbc
オラクル社
java.io
javax.servlet
オラクル社、Javaプロジェクト
com.ibm.websphere
IBM社、WebSphereプロジェクト
com.jboss
JBossプロジェクト

3. ファイルの内容

Java 言語標準によれば、クラス名とそのパッケージの名前に関する情報がコードを含むファイルに含まれている必要があります。一般的な形式を以下に示します。

package package-name;

public class ClassName
{

}

パッケージ名はフォルダー名と一致し、ファイル名はパブリック クラス名と一致する必要があります。

ファイルがある場合は、次のものが含まれている必要があります。...\src\com\project\Service.java

package com.project;

public class Service
{

}

4. クラスのインポート

クラスパッケージ名は、いわゆるクラスの完全修飾名を形成します。

例:

完全修飾名 パッケージ名 クラス名
java.io.FileInputStream
java.io
FileInputStream
java.lang.String
java.lang
String
java.util.ArrayList
java.util
ArrayList
org.apache.tomcat.Servlet
org.apache.tomcat
Servlet
Cat
なし
Cat

良いニュース:

完全修飾クラス名はプロジェクト内で常に一意です。結局のところ、1 つのフォルダー内に同じ名前の 2 つのファイルを作成することはできません。

悪いニュース:

完全修飾クラス名は通常、長いか非常に長いです。また、コード内で毎回長い名前 (java.util.ArrayList など) を書き出すのは非常に不便です。

そのため、Java にはクラスをインポートする機能が追加されました。

コード内でクラスの短縮名を使用できますが、最初に、どの完全修飾クラス名がその短縮名に対応するかをコンパイラーに知らせる必要があります。プロジェクト内に同じ名前のクラスが複数ある場合はどうなるでしょうか? または、もともと 1 つあったのに、さらに 15 個追加されました...

コードで短いクラス名を使用するには、次の構成を追加する必要があります。

import fully-qualified-class-name;

この宣言は、クラスの先頭、package宣言の直後に追加する必要があります。

例:

package com.codegym.tasks.task01;

import java.util.Scanner;
import com.test.helper.special.ArrayList;

public class Solution
{
   public static void main(String[] args)
   {
     Scanner console = new Scanner(System.in);
     ArrayList list = new ArrayList();
   }
}

2 つのクラス (と)をインポートしたので、コード内でそれらの短縮名を使用できます。そして、コンパイラはどのクラスを使用するかを認識します。java.util.Scannercom.test.helper.special.ArrayList

を使用しなかった場合、同じコードは次のようになりますimport

package com.codegym.tasks.task01;

public class Solution
{
   public static void main(String[] args)
   {
     java.util.Scanner console = new java.util.Scanner(System.in);
     com.test.helper.special.ArrayList list = new com.test.helper.special.ArrayList();
   }
}

ちなみに、プロジェクトに という名前の 2 つのクラスがある場合Scanner、両方を同じファイルにインポートすることはできません。一方のクラスには長い名前を使用する必要があります。

あなたのチームにジェンがいるとします。誰もが彼女が誰であるかを知っているので、コミュニケーションの問題はありません。ただし、Jens が 3 つある場合は、それらを区別するために完全修飾名を使用する必要があります。

注1

ちなみに、クラスにインポート ステートメントをたくさん追加するのが面倒な場合は、その遅延バージョンを使用できます。特定のクラス名の代わりにアスタリスクを入力します。

import package-name.*;

これにより、パッケージ内のすべてのクラスの短縮名を使用できるようになります。

注2

パッケージ内のすべてのクラスは自動的にインポートされるため、それらに対するステートメントjava.langを作成する必要はありません。import次のクラスのいずれかをすでに知っているはずですjava.lang.String。はい、そうです。これはString文字列を操作するために使用したクラスです。