Javaプロジェクトでは、 すべての.javaファイルを同じフォルダーに保持するということは、それらが同じパッケージにあることを意味しますか?
すべてのプロジェクトファイルを1つのフォルダーに保持することと比較して、プロジェクトのパッケージを作成することの違いは何ですか?
このスレッドは私の質問に実際には対応していません。
パッケージとディレクトリの間には関係がありますが、それはあなたが維持しなければならないものです。「mypackage1.mypackage2」にあるクラスがある場合、java
コマンドは「mypackage1 \ mypackage2」という名前のディレクトリ構造(「後方」のWindows表記を想定)でそのディレクトリ構造がさらに埋め込まれていることを期待していることを意味します。 classpath
(または「現在のディレクトリ」に直接 ある)名前のディレクトリ(「myjava」と呼びましょう)内。
したがって、Javaクラス(内部的package mypackage1.mypackage2;
には)は「\ Users \ myName \ myjava \ mypackage1 \ mypackage2 \」にあり、クラスパスに「\ Users \ myName \ myjava」を配置するか、現在のディレクトリを「\Users\ myName\myjava」に設定します。
これを混同すると、クラスがまったく見つからないか、あいまいな「NoClassDefFoundError」のようなエラーが発生します。
パッケージ(およびディレクトリ)を使用する理由については、その理由は「名前空間」と「関心の分離」に関係しています(それらを調べてください)。パッケージがなく、すべての「java.lang」、「java.io」、「sun.misc」などのクラスが一緒になっていると、Javaをまっすぐに保つのははるかに困難になります。まず、名前の「プレフィックス」を使用して、名前をまっすぐに保ち、名前の競合を回避する必要があります。そして、論理的なグループ化の多くは失われます。
自分のプロジェクトでは、自分で作成する単純な小さなプログラムのパッケージを使用する必要はありませんが、他の人に渡す可能性のあるものを作成する場合は、「myname.myproject」などのパッケージを使用するのが礼儀です(名前をもちろんプロジェクト)なので、あなたがそれを与える人は、名前の衝突なしにそれを他の人と組み合わせることができます。
大規模なアプリケーションでは、さらにレベルの分離を使用すると、関数をまっすぐに保つのに役立つため、すべてがどこにあるかがわかります。また、異なる機能領域間の「境界を越える」ことを思いとどまらせるので、無関係なロジックが絡み合うことはありません。
Eclipse(これを使用する場合)は、ディレクトリ名とパッケージ名を提供することを「望んで」おり、場合によっては(常にではありませんが)それらの同期を維持するため、問題を少し混乱させます。
パッケージは、クラスに論理名前空間を提供します。
また、これらのパッケージはディレクトリレベルの形式で保存され(ネストされたディレクトリに変換されます)、クラスに物理的なグループ化(名前空間)を提供します。
また、physical
名前空間は名前空間に準拠している必要があることに注意してくださいlogical
。ディレクトリ構造の下に、を使用してクラスを作成することはできません:- 、下にある必要があります。このディレクトリはクラスパスに追加され、クラスは次のようになります。コードを実行すると、JVMに表示されます。package com.demo
\com\demo\temp\
\com\demo\
次のディレクトリ構造があるとします。-
A
|
+-Sample.java(パッケージBの下にデモクラスが含まれています) | +-Outer.java(デモクラスを含む-パッケージなし) | +-B | | | +-Demo.class | +-C | | | +-Abc.class | +-Demo.class
クラスAbc.class
とDemo.class
(ディレクトリAの下)がどのパッケージの下でも定義されていないのに対し、クラスDemo.class
(ディレクトリBの下)は。の下で定義されているとしpackage B
ます。したがって、クラスパスに2つのディレクトリが必要です。- \A
(2つのクラスの場合:- Demo.class
とB.Demo.class
)および\A\C
(クラスの場合Abc.class
)。
Demo.class
そのため、上記で定義した2つの間に競合は発生しませんpackages
。それがそれらを..に分割することの全体的なポイントnamespaces
です。クラスの一意の名前が不足することはないので、これは有益です。クラスローダーサブシステムを理解することはあなたの質問に答えます。
完全修飾型名が与えられた場合、原始クラスローダーは何らかの方法で型の単純名に「.class」を加えたファイルを見つけようとする必要があります。したがって、JVMは、CLASSPATHという名前の環境変数に格納されているユーザー定義のディレクトリパスを検索します。原始ローダーは、適切な名前(タイプの単純名と「.class」)のファイルが見つかるまで、各ディレクトリーをCLASSPATHに表示される順序で調べます。タイプが名前のないパッケージの一部でない限り、基本ローダーは、ファイルがCLASSPATH内のディレクトリの1つのサブディレクトリにあることを想定しています。サブディレクトリのパス名は、そのタイプのパッケージ名から作成されます。たとえば、原始クラスローダーがクラスjava.lang.Objectを検索している場合、オブジェクトを検索します。