2009-08-26 9 views
13

の違いは何ですか:Javaのimport混乱

java.awt.*; 

と:

java.awt.event.*; 

は、私は多くのプログラムで両方を見つけます。

答えて

33

Javaのパッケージはネストされていません。あなたはは、java.awt.eventとしてjava.awt下にあるすべてのパッケージを、インポートされていません - あなたimport java.awt.*、あなただけのパッケージjava.awtにあるすべてのクラスとインターフェイスをインポートしている

パッケージがネストされているように見えます(つまり、の「サブパッケージ」であると思われます)。これは実際のケースではありません。 java.awtjava.awt.eventは、名前に共通の部分を持つ2つの異なる無関係なパッケージとみなす必要があります。

+1

import java.awt。*が自動的にjava.awt.eventもインポートするのは本当ですか? –

+15

いいえ - それはJesperの指摘でした。 import java.awt。*;パッケージが正確にjava.awtであるすべてのクラスをインポートします。パッケージがjava.awtで始まるクラスはインポートされません。 – Sbodd

5

java.awtパッケージ(ただしそのサブパッケージではない)からのインポートのみ、java.awt.eventからのインポートのみ(他のパッケージからのインポートはありません)。

Javaのパッケージは階層構造にすることができますが、その階層構造で構成する必要がありますが、importステートメントは「保守的」な傾向があります。そのパッケージ内からすべての型をインポートすると、階層の下位レベルにあります。

私はそれの背後にある理論的根拠が偽の輸入を避けることだと思います。依存関係やあいまい性を避けるために、できるだけ少ないものをインポートすることはお勧めです(たとえば、新しいクラスが名前に矛盾する名前でパッケージに追加された場合どうなりますか?別のパッケージ?)。そのため、Eclipseを使用してインポートを整理すると、実際にはアスタリスクのバージョン内に特定のインポートステートメントが追加されますが、これは余分な行を意味します。サブパッケージ内のすべてをインポートすることはさらに悪化します。本当にすべてを取得します。

さらに、一般的なプラクティスは、専用クラスと実装固有クラスをそれぞれのサブパッケージに入れることです。特に重要でない限り、インポートすることを避けたいと思うことがよくあります。繰り返しますが、サブツリー全体をインポートすることはそれと矛盾します。

0

java.awt.*ではありません。あなたが期待していると思うものです。

java.awt.*は、ネストされたパッケージではなく、正確なパッケージのクラスのみを提供します。下の名前空間の衝突を想像してみてください!

import com.* 

それは*を使用するには、悪い習慣とみなされることに留意すべきです。クラス名のインポートが優先されることを説明します。さらに読書のために

:多くの同様Wikipedia: Namespace (Computer Science)

+0

import *もサポートされていますか? :-o – OscarRyz

+2

@Oscar Reyes:いいえ、 "import *"はJavaには存在しません。 – Jesper

+0

が合意した、うまくいかない(実際に私を驚かせる)。誰かを混乱させないように私はそれを変更します... –

1

は前に言ってきました。

インポート持つjava.awt。* java.awt.eventのいずれかのクラスをインポートしません...

そして、それらの2つのパッケージの違いは、java.awtです。* Frame、Buttonなどのクラスとjava.awt.event。*パッケージには、発生するすべてのイベント/リスナーが含まれます。

例:ボタンを作成するには、クラスjava.awt.Buttonが必要ですが、ボタンをクリックしたときにアクションが発生するようにするには、java.awt.event.ActionListenerが必要です。クリックしてから、java.awt.event.ActionEventを生成します。