2013-06-03 4 views
5

Если я говорю:импортирующие классы, используя подстановочные

import java.awt.event.ActionListener; 

Я получаю ActionListener класса. Если я говорю:

import java.awt.event.*; 

Я получаю класс событий включая ActionListener? Или еще лучше:

import java.awt.*; 

Я подумал, что если вы включили класс, как в последние два примера, что вы эффективно импортирован этот класс и унаследовал все его подклассы. Но, когда я использую только последнюю строку, например, Eclipse часто показывает ошибки, говорящие, что не может разрешить определенные элементы, и предлагает включить как java.awt, так и java.awt.event.

+4

Использование 'import java.awt. *' Будет импортировать только классы в пакет 'java.awt' (если есть). Обратите внимание, что '*' wildcard не является рекурсивным для пакетов. –

+2

Ваши последние два образца не включают классы, они * импортируют пакеты. * – EJP

ответ

5

Импорт подстановочных знаков в Java работает только на том уровне, на котором реализуются классы.

То есть, если у вас есть классы A, B и C с полностью квалифицированными именами:

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

затем импортировать com.foo.bar.* позволит получить доступ к A и B без дальнейших проволочек; но C НЕ будет доступен.

В том же ключе, импорт com.foo.* будет легко иметь C доступны, но не A и B.

Сейчас:

Я подумал, что если вы включили класс, как в последние два примера, что вы эффективно импортирован этот класс и унаследовал все его подклассы.

Это не так. Даже если B «наследует» A, если вы решите использовать полный импорт com.foo.bar.A, он НЕ будет автоматически импортировать com.foo.bar.B. Вам придется импортировать B отдельно. Что имеет смысл: ничто не заставляет реализацию интерфейса или абстрактного класса быть в том же пакете, что и его базовый интерфейс/базовый класс, для одного; и в том же проекте у вас могут быть два класса с именем B, в разных пакетах: что должен делать компилятор?

Теперь, в соответствии с соглашениями о стиле кодирования, которые вы либо сами придумываете, либо должны подчиняться в своей рабочей среде, такие подстановочные импорты могут быть просто и просто запрещены, и вам придется импортировать и B отдельно. Что касается статического импорта, у них есть и другие проблемы ...

И, наконец, обратите внимание, что по умолчанию вы можете использовать все java.lang.*, не декларируя импорт.

+0

Я вижу. Спасибо. В любом случае, чтобы импортировать в том смысле, который я описывал? – sherrellbc

+1

Хорошо, вижу. Если здесь B расширяет A, тогда 'import com.foo.bar.A;' НЕ даст вам доступ к B. Вам придется импортировать B отдельно. Что имеет смысл: ничто не заставляет реализацию интерфейса или абстрактного класса находиться в том же пакете, что и их базовый интерфейс/базовый класс (к счастью!) (Отредактированный ответ соответственно) – fge

3

java.awt.* отличается с java.awt.event.*, первым будет импортировать все классы в java.awt пакете, в то время как второй будет импортировать все классы в java.awt.event, функция импорта позволяет импортировать классы, а не пакеты.

3

Из Java Tutorials: Apparent Hierarchies of Packages

Сначала пакеты кажется иерархическим, но они не являются. Например, 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.*;

3

Помните, что import - это просто для удобства. Именно здесь вы можете использовать короткое имя класса, а не полное имя.

Структура имени пакета в Java соответствует структуре каталогов. Таким образом, вы можете думать об этом как каталог с именем Java и в этом каталоге есть несколько других каталогов, таких как AWT и Ио и т.д.

Когда вы говорите

import java.awt.*; 

вы в основном говорят, что вы хотите использовать краткое имя для всех классов в каталоге с именем awt внутри каталога с именем java. Так что если вы используете имя класса в вашем коде, как это:

List mylist; 

Затем компилятор попытается найти либо класс с именем Список в текущем пакете или класс с именем java.awt.List.

Так что если у вас есть каталог внутри каталога AWT называется событие, и у вас есть класс с именем ActionEvent в этом каталоге, то полное имя:

java.awt.event.ActionEvent 

и оператор импорта выше не помогает.Таким образом, причина необходимости еще одно заявления

import java.awt.event.*; 

импорта Теперь, если вы используете класс ActionEvent компилятора ищет класс с именем ActionEvent в текущем каталоге или java.awt.ActionEvent или java.awt.event.ActionEvent пока не найдет его.

+0

+1 Хороший ответ. –

2

Из документации Sun по Using Package Members:

На первом, пакеты кажутся иерархическим, но они не являются. Например, API Java включает в себя пакет 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.*; 

Если у вас есть время , вам, вероятно, удастся прочесть the entire Packages trail от солнца, который тщательно изучает основы и более сложные концепции. Из языка в вашем вопросе, где вы ссылаетесь на другие операторы импорта как включающие определенные классы, похоже, что вы не понимаете, что вы действительно ссылаетесь на пакеты.

+0

Пакеты классов? Я перепутал свой жаргон. Начал java, начиная с C, несколько дней назад. – sherrellbc

+0

«Я получаю класс события, включая ActionListener? Или еще лучше:« «Я думал, что если бы вы включили класс, как в последних двух примерах, то вы фактически импортировали этот класс и унаследовали все его подклассы». Если у вас был смешанный жаргон, все в порядке, но эти предложения действительно казались, что вы сначала относились к пакетам как к классам. – ojintoad

Смежные вопросы