Смешение импорта Java

В чем разница между:

java.awt.*;

и

java.awt.event.*;

Я нахожусь и во многих программах.

Ответы

Ответ 1

Пакеты в Java не вложены.

Когда вы import java.awt.*, вы импортируете только все классы и интерфейсы в пакете java.awt - вы не импортируете все пакеты под java.awt, например java.awt.event.

Несмотря на то, что выглядит как вложенные пакеты (т.е. похоже, что java.awt.event является "подпакетом" java.awt), на самом деле это не так. Вы должны рассматривать java.awt и java.awt.event как два разных несвязанных пакета, которые имеют общую часть в их именах.

Ответ 2

Первый тип импортирует только из пакета java.awt(но не его подпакетов), а другой импортирует только из java.awt.event(но не из других пакетов).

Хотя пакеты в Java могут (и должны быть) организованы в иерархии, оператор импорта имеет тенденцию быть "консервативным" - при импорте всех типов из этого пакета вы получаете только те, которые находятся на этом уровне, а не на более низкий уровень в иерархии.

Я думаю, что причина этого в том, чтобы избежать ложного импорта. Как правило, рекомендуется импортировать как можно меньше - просто необходимые предметы, чтобы избежать связи, зависимостей и неоднозначностей (например, что произойдет, если новый класс добавлен в пакет с именем, которое конфликтует с именем в другой упаковка?). Поэтому, если вы используете Eclipse для организации импорта, он фактически добавит определенные операторы импорта внутри версии звездочки, хотя это означает дополнительные строки. Импорт всего в подпакеты будет еще хуже, вы действительно получите все.

Кроме того, общепринятой практикой является размещение классов специального назначения и классов, специфичных для реализации, в их собственных подпакетах. Часто вы особенно хотите избежать их импорта, если это не важно. Опять же, импорт всего поддерева будет конфликтовать с этим.

Ответ 3

Как многие говорили раньше.

import java.awt. * не будет импортировать какие-либо классы в java.awt.event...

И разница между этими двумя пакетами заключается в том, что java.awt. * включает классы, такие как Frame, Button и т.д., а пакет java.awt.event. * включает в себя все события/слушатели, которые могут произойти.

Например, для создания кнопки вам нужен класс java.awt.Button, но если вы хотите, чтобы любое действие произошло, когда вы нажимаете кнопку, вам нужен java.awt.event.ActionListener, который будет "ждать" щелчка, затем создайте файл java.awt.event.ActionEvent.

Ответ 4

java.awt.* не является регулярным выражением, которое, как я думаю, вы ожидаете/думаете.

java.awt.* предоставит вам только классы этого точного пакета, а не вложенные пакеты. Представьте, что столкновения пространства имен связаны с ниже!

import com.*

Следует отметить, что использование * считается неправильной практикой. Предпочтительным является импорт имён классов.

Для дальнейшего чтения: Википедия: Пространство имен (компьютерная наука)