6

私はJava開発の初心者です。Java での再帰インポートについて簡単な質問があります。

パッケージ「pkg」に次のものが含まれていると仮定しましょう

  • クラスA、
  • パッケージ B (これには B1 クラスが含まれます)
  • パッケージ C (これには C1 クラスが含まれます)

パッケージ「B」および「C」からクラスをインポートできないのはimport pkg.*なぜですか?

Java が再帰インポートを許可しない理由を理解したいと思います。

4

4 に答える 4

11

あなたの質問は、あなたがパッケージからimport pkg.*クラスをインポートすることを確かに許可されているので、あなたの質問は不十分に表現されています. つまり、これを行うことはまったく問題ありません。pkg.Bpkg.C

import pkg.*;
import pkg.B.*;
import pkg.C.*;

しかし、あなたが本当に求めているimport pkg.*のは、のサブパッケージで宣言された型を自動的にインポートしない場合、その理由だと思いますpkg。それに答えるには、Java 言語仕様に目を向けるのが最善です。

パッケージの階層的な命名構造は、従来の方法で関連するパッケージを整理するのに便利であることを目的としていますが、最上位の型と同じ単純な名前を持つサブパッケージを持つパッケージを禁止すること以外には意味がありません (§7.6)。そのパッケージで宣言されています。

たとえば、 という名前のパッケージと という名前oliverの別のパッケージoliver.twistの間、または とevelyn.woodという名前のパッケージの間に特別なアクセス関係はありませんevelyn.waugh。つまり、 という名前のパッケージ内のコードは、他のパッケージ内のコードよりも、oliver.twistパッケージ内で宣言された型に適切にアクセスできません。oliver

つまり、 の場合、という名前のパッケージに含まれるコンパイル ユニットによって定義されたimport pkg.*すべてのトップレベルのpkgをインポートしていますが、 (またはなどの)のサブパッケージはインポートしていませんpkgpkg.Bpkg.C

于 2013-08-15T02:52:16.220 に答える
6

なぜimport java.awt.*インポートしないのかなどを尋ねているようですjava.awt.color.*

これは、このチュートリアルで説明されている場所で最もよく説明されています

最初、パッケージは階層的に見えますが、そうではありません。たとえば、Java API には、java.awt パッケージ、java.awt.color パッケージ、java.awt.font パッケージ、および java.awt で始まる他の多くのパッケージが含まれています。ただし、java.awt.color パッケージ、java.awt.font パッケージ、およびその他の java.awt.xxxx パッケージは、java.awt パッケージに含まれません。接頭辞 java.awt (Java Abstract Window Toolkit) は、関係を明確にするために多数の関連パッケージに使用されますが、含まれていることを示すためではありません。

さらに重要なことには、

java.awt.* をインポートすると、java.awt パッケージ内のすべてのタイプがインポートされますが、java.awt.color、java.awt.font、またはその他の java.awt.xxxx パッケージはインポートされません。java.awt.color と java.awt のクラスおよびその他のタイプを使用する場合は、両方のパッケージとそのすべてのファイルをインポートする必要があります。

import java.awt.*;
import java.awt.color.*;
于 2013-08-15T02:50:26.087 に答える
1

Java での規則は、必要なクラスのみをインポートすることです。ほとんどの IDE では、自動的に整理されます。クラスを一括でインポートすることは、他の言語のように一般的ではありません。

于 2013-08-15T02:46:58.150 に答える
0

元の質問 (編集前) で説明したように、インポートに制限はありません。

次の階層があるとします。

pkg1
    A.java
pkg1.pkg2
    B.java
pkg1.pkg3
    C.java
    D.java

A.java、B.java、C.java、D.java、またはそれらの組み合わせのいずれかをインポートすることが許可されています。

import pkg1.A;
import pkg1.pkg2.B;
import pkg1.pkg3.C;
import pkg1.pkg3.D;

唯一の注意点は、クラス C 内では、同じパッケージを共有しているため、D を明示的にインポートせずにクラス D を使用できることです。

ただし、次のような包括的なステートメントimport pkg1.*は、パッケージ階層のさらに下にあるクラスを取得しません。などの各サブパッケージもインポートする必要がありますimport pkg1.pkg2.*。これは、言語の設計方法です。

于 2013-08-15T02:45:17.370 に答える