2013-08-15 3 views
3

Я новичок в разработке Java. У меня есть быстрый вопрос относительно рекурсивного импорта на Java.Рекурсивный импорт Java

Давайте предположим, что пакет "PKG" содержит следующие

  • класс А,
  • пакет B (Это, в свою очередь, содержит класс B1)
  • пакет С (Это, в свою очередь, содержит C1-класс)

Почему я не могу импортировать классы из пакетов «B» и «C»?

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

+3

Ваш вопрос непонятен. На самом деле, между пакетами не существует очень большой зависимости, кажущаяся иерархия; тот факт, что у вас есть 'pkg' и' pkg.B', действительно не имеет отношения к ним каким-либо полезным способом. Какой класс вы пытаетесь импортировать, и что вы подразумеваете под «не разрешено»? – chrylis

+0

Что не так с этим? –

ответ

6

Ваш вопрос плохо если у вас import pkg.*, вам, безусловно, разрешено затем импортировать классы из пакетов pkg.B и pkg.C. То есть, это прекрасно, чтобы сделать это:

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

Но я предполагаю, что вы на самом деле спрашиваете, почему, если вы import pkg.* не автоматически импортировать типы, объявленные в подпакетах pkg. Для того, чтобы ответить на этот вопрос, то лучше обратиться к Java Language Specification:

Иерархическая структура именования пакетов предназначена быть удобным для организации пакетов, связанных с обычным способом, но не имеет никакого значения в себе, кроме запрета против пакет, имеющий подпакет с таким же простым именем, как тип верхнего уровня (§7.6), объявленный в этом пакете.

Например, нет особых отношений доступа между пакетом с именем oliver и другой пакетом с именем oliver.twist, или между пакетами именем evelyn.wood и evelyn.waugh. То есть код в пакете с именем oliver.twist не имеет лучшего доступа к типам, объявленным в пакете oliver, чем код в любом другом пакете.

Другими словами, когда вы import pkg.*, вы импортирования всех верхнего уровня типов, определенные в единицах компиляции, содержащихся в пакете с именем pkg, но вы не импорта любого из суб- пакеты pkg (например, pkg.B или pkg.C).

+0

Устранил мои сомнения ..Tx – UnderDog

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.* и т. д. Это просто то, как язык разработан.

+0

Нет иерархии пакетов. 'my.package' полностью отличается от' my.otherpackage' –

+0

Это хорошо? И очевидно? Я понятия не имею, что вы подразумеваете под своим комментарием на четырехлетний ответ. Прочтите последний абзац. Пакет не зависит от всех других пакетов. –

1

Конвенция на Java предназначена для импорта только тех классов, которые вам нужны. Большинство IDE автоматически организуют их для вас. Импорт классов навалом не распространен, как на других языках.

5

Похоже, вы спрашиваете, почему import java.awt.* также не импортирует java.awt.color.* и так далее.

Это лучше всего объясняется this tutorial, где он говорит

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