2013-06-03 3 views
5

を使用してクラスをインポートします。 私が言う場合:は、ワイルドカード

import java.awt.event.*; 

私はのActionListenerを含むイベントクラスを取得しますか?まだ またはより良い:

import java.awt.*; 

私はあなたが効果的にそのクラスをインポートし、そのサブクラスのすべてを継承していること、最後の二つの例のように、あなたはクラスが含まれている場合と思いました。しかし、たとえば最後の行だけを使用すると、Eclipseは特定の項目を解決できないというエラーを表示し、の両方を含めることを提案します。 java.awtおよびjava.awt.event。

+4

'import java.awt。*'を使うと 'java.awt'パッケージ(もしあれば)のクラスだけをインポートします。 '*'ワイルドカードはパッケージごとに再帰的ではないことに注意してください。 –

+2

あなたの最後の2つのサンプルは 'クラスを含んでいません。パッケージをインポートします。* – EJP

答えて

5

Javaでの「ワイルドカード」インポートは、クラスが実装されている即時レベルでのみ機能します。

あなたは完全修飾名を持つクラスABC、持っている場合は、次のとおりです。

  • com.foo.bar.Aを。
  • com.foo.bar.B;
  • com.foo.C;

com.foo.bar.*をインポートすると、ABにアクセスできます。 Cは利用できません。

同じように、com.foo.*をインポートすると、ABではなく、Cが利用可能になります。今

私はあなたが効果的にそのクラスをインポートし、そのサブクラスのすべてを継承していること、最後の二つの例のように、あなたはクラスが含まれている場合と思いました。

これはありません。 Bが「継承」Aになっても、完全修飾インポートcom.foo.bar.Aを使用すると、com.foo.bar.Bが自動的にインポートされません。 Bを別途インポートする必要があります。どちらの意味があるのですか:インターフェースや抽象クラスの実装を、それらの基本インターフェース/基本クラスと同じパッケージにすることを強制するものはありません。同じプロジェクトでは、Bという2つのクラスを別々のパッケージに持つことができます:コンパイラは何をすべきですか?

ここでは、自分で補うか、職場環境で従わなければならないコーディングスタイルの規則に従って、そのようなワイルドカードのインポートは完全に禁止されている可能性があります。ABを別々にインポートする必要があります。静的インポートについては、他の問題があります。

最後に、インポートを宣言することなく、デフォルトではjava.lang.*のすべてを使用できます。

+0

です。ありがとうございました。とにかく私は説明していた意味で輸入するのですか? – sherrellbc

+1

OK、わかりました。ここでBがAを拡張すると、 'import com.foo.bar.A;'はBへのアクセス権を与えません。Bを別々にインポートする必要があります。どんな意味がある:インターフェースや抽象クラスの実装は、基本インターフェース/基本クラス(幸いにも!)と同じパッケージになるように強制するものはありません。(それに応じて編集された) – fge

3

java.awt.*は、二番目はjava.awt.event内のすべてのクラスをインポートする一方、java.awtパッケージ内のすべてのクラスをインポートします最初の1、インポート機能がするだけインポートクラスではなく、パッケージjava.awt.event.*と異なっています。

3

のJavaチュートリアルから:Apparent Hierarchies of Packages

まず、パッケージは、階層のように見えるが、そうではありません。たとえば、Java APIにはjava.awtパッケージ、java.awt.colorパッケージ、java.awt.fontパッケージ、およびその他のjava.awtで始まるパッケージが含まれています。ただし、パッケージjava.awt.colorjava.awt.fontパッケージ、およびjava.awt.xxxxパッケージは、java.awtパッケージに含まれていません。接頭辞java.awt(Java Abstract Window Toolkit)は、関係を明示するためにいくつかの関連パッケージに使用されますが、包含関係は示されません。 java.awt.*のインポート

java.awtパッケージ内の型のすべてを輸入し、それはjava.awt.colorjava.awt.font、または任意の他のjava.awt.xxxxパッケージをインポートしません。あなたはjava.awtのものと同様java.awt.colorにクラスや他のタイプを使用する場合は、すべてのファイルを両方のパッケージをインポートする必要があります。

import java.awt.*;

import java.awt.color.*;

3

がいることを忘れないでくださいimport文は便宜上のものです。完全修飾名ではなく、クラスの短い名前を使用することが可能になります。

Javaのパッケージ名の構造は、ディレクトリ構造に対応しています。だから、という名前のディレクトリのjavaと考えることができ、そのディレクトリにあなたが

import java.awt.*; 

あなたは基本的に使用したいと言っていると言うなど、AWTとIO

など他のいくつかのディレクトリがありますjavaというディレクトリ内のawtという名前のディレクトリ内のすべてのクラスの短い名前。あなたはこのようなあなたのコード内のクラス名を使用するのであれば:

List mylist; 

その後コンパイラは、現在のパッケージまたはjava.awt.Listという名前のクラスのいずれかでクラスという名前のリストを見つけることを試みます。

あなたはイベントと呼ばAWTディレクトリ内のディレクトリを持っていて、そのディレクトリ内のActionEventという名前のクラスを持っているのであれば、完全修飾名は次のとおりです。

java.awt.event.ActionEvent 

と上記のimport文は役立ちません。したがって、あなたは、コンパイラは、現在のディレクトリ内のActionEvent、またはjava.awt.ActionEventまたはjava.awt.event.ActionEventという名前のクラスを探しにActionEventクラスを使用する場合は、今すぐ別のimport文

import java.awt.event.*; 

を必要とする理由それが見つかるまで。

+0

+1良い答え。 –

2

Using Package Members上のSunのドキュメントから:まず

、パッケージは、階層のように見えるが、そうではありません。たとえば、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パッケージをインポートしません。 。あなたは時間があれば

import java.awt.*; 
import java.awt.color.*; 

:あなたはクラスや他のタイプjava.awt.colorの中 などjava.awtのそれらを使用する場合は、すべてのファイルを両方 パッケージをインポートする必要がありますあなたは基本的なこととより複雑な概念を徹底的に超えた太陽からthe entire Packages trailを通して読むことはおそらくうまくいくでしょう。あなたの質問の言語から、2番目のインポートステートメントを特定のクラスを含むものとして参照すると、実際にパッケージを参照していることを理解していないように思えます。

+0

クラスのパッケージ?私は専門用語が混ざり合っていました。数日前にCからJavaを起動しました。 – sherrellbc

+0

"ActionListenerを含むイベントクラスを取得しましたか?それとも良いですか:" "最後の2つの例のようにクラスを含めると、そのクラスを効率的にインポートし、すべてのサブクラスを継承すると思いました。 専門用語が混ざり合っていれば、それは問題ありませんが、最初にクラスとしてパッケージを参照していたように見えるようになりました。 – ojintoad