2010-07-16 2 views
0

Предположим, что где-то я импортирую javax.servlet.http.HttpServlet.Java-пакет и недоумение имени класса

Мои вопросы:

  1. ли это значит: я мог бы найти структуру папок, как javax/сервлет/HTTP где-то и в этом файле HttpServlet.class будет присутствовать?

  2. Если нет, то где именно этот файл класса может быть найден?

  3. Означает ли это: это просто вложенные пространства имен, не имеющие отношения к структурам папок?

  4. Имя пакета в вышеупомянутом импорте будет javax.servlet или javax.servlet.http? Вероятно, оба являются пакетами, а первый - супер пакетом более поздней версии?

  5. Как этот файл класса фактически включен? Я читал, что импорт не похож на c/C++ include.

Спасибо.

+1

Это не «сомнения» ... это «вопросы». –

+0

@ Stephen C: заменил «сомнения» на «вопросы» :) – understack

ответ

2
  1. да

  2. см 1.

  3. см 1.

  4. имя пакета javax.servlet.http

  5. загрузчик классов найдет класс (от его пути к классам) во время выполнения

1

ли это значит: я мог бы найти папку структуру как javax/сервлет/HTTP где-то и в этом HttpServlet.class файл будет присутствовать?

Да (скорее всего упакован в файл банку)

Package name in the above mentioned import would be 

javax.servlet или javax.servlet.http? Возможно, оба являются пакетами и сначала один супер пакет более позднего?

Да снова

Как этот класс файл на самом деле включен? Я читал, что импорт не похож на c/C++ include.

импорт packagename.classname и должен быть перед объявлением класса Ex:

import javax.servlet.http.HttpServlet; 
+0

Только для пояснений: 'javax.servlet' не является« супер-пакетом »' javax.servlet.http'. Имена пакетов (пространства имен) всегда не связаны друг с другом, они равны или различны, и ничего больше. –

+0

Спасибо, Андреас, ты прав. Я интерпретировал его в контексте иерархии, означающей, что http - это подпакет сервлета.Прочитав другие ответы, я понял, что допустил ошибку. – Ross

2
  1. Да
  2. Это также может быть в файле JAR (в javax/сервлет/HTTP каталог)
  3. Нет (см. 1.)
  4. Точнее, это родительская упаковка
  5. Импорт gi ves доступ к классам, внешним по отношению к скомпилированному файлу. Файл .class содержит ссылки на внешние классы, в которых он нуждается. Константы (конечные статические переменные) могут быть встроены (их значения вставляются компилятором в код, который их использует).
+0

«родительский пакет» - это чисто конвенция. Что касается платформы Java, эти два пакета не имеют отношения к 'com.foo' и' org.bar'. –

2

1 - Означает ли это: я мог бы найти структуру папок, как javax/servlet/http где-то и внутри этого HttpServlet.class файл будет присутствовать?

В этом случае, возможно, не в файловой системе, как таковой. (Этот класс является частью библиотек времени исполнения J2SE.)

2 - Если нет, то где именно этот файл класса может быть найден?

В файле JAR, который находится на пути к классу JVM или bootclasspath. Файл JAR представляет собой архив, содержащий файлы .class и другие ресурсы. Путь к классу в файле JAR будет /javax/servlet/http/HttpServlet.class. (В этом случае класс в файле rt.jar.)

3 - Означает ли это: Это просто вложенные пространства имен, не имеющих отношения к структуре папок?

Нет. Если у вас есть папки файловой системы на пути к классу, они могут быть найдены, чтобы найти классы до или после файлов JAR, в зависимости от того, где они находятся на пути к классам. Путь к классам эффективно перекрывает пространства имен. Пространства имен файлов JAR могут перекрывать пространства имен папок файловой системы и наоборот, в зависимости от эффективного пути к классам.

4 - Название упаковки в вышеупомянутом импорте будет javax.servlet или javax.servlet.http?

javax.servlet.http

4 продолжение - Вероятно, оба пакета и первые один супер пакет более поздний?

Оба являются пакетами, но в Java нет такой вещи, как «супер пакет». Что касается языка Java, то javax.servlet и javax.servlet.http являются несвязанными пакетами. Некоторые люди могут сказать, что javax.servlet является родительским пакетом javax.servlet.http, но это утверждение не имеет никакого внутреннего смысла с точки зрения языка Java. Очевидные отношения между родителями и детьми являются чисто условными.

5 - Как этот файл класса фактически включен? Я читал, что импорт не похож на C/C++.

Файл класса не «включен» в каком-либо смысле. Java import - это нечто большее, чем сокращенное название, которое позволяет ссылаться на импортированное имя, не указывая его полное имя пакета.

+0

Обратите внимание, что имя файла 'rt.jar' является просто общим именем, используемым несколькими реализациями, но не обязательным. –

+0

Все Sun JVMs я верю ... –

1

полное имя класса состоит из один имя пакета (в пространстве имен) и имя класса. Давайте рассмотрим простой пример:

java.lang.Object 

The (простой) имя_класс является Object, то имя_пакет является java.lang. В JLS есть практическая рекомендация для создания идентификатора пакета с идентификаторами, разделенными точками. Это практично, потому что таким образом мы можем сопоставить packagename с структурой папок. Пакетное имя из приведенного выше примера сопоставляется с ./java/lang, полным именем класса с файлом ./java/lang/Object.class для двоичного файла и ./java/lang/Object.java для исходного файла.

Это упрощает загрузку classloader для файлов классов в файловой системе. Классный загрузчик просто оценивает пространство имен (packagename) для папки и простое имя класса для имени файла класса.

Общепринятое недоразумение - это мышление, packagenames несколько иерархичны. Это неправда. Между пакетами com.example.bean и com.example.bean.impl нет никакой связи. Первый не является своего рода родительским пакетом.

0

Для ответа немного высокого уровня: имя пакета - это способ создания пространства имен - иерархии пространств имен не существует. Тем не менее, фактический класс (с использованием полностью квалифицированного имени, например javax.servlet.http.HttpServlet) должен быть загружен ClassLoader.

Стандартный класс ClassLoader, используемый JVM, представляет собой экземпляр java.net.URLClassLoader (ну, подкласс). Это может искать классы, учитывая начальную точку либо каталога, либо JAR-файла. Имя пакета является наложенным на структуру файловой системы, чтобы получить местоположение класса.

Есть другие ClassLoaders - большинство также следует за этим соглашением в некоторой степени, но это просто соглашение. ClassLoaders могут загружать классы, но они выбирают, в том числе динамически генерируя их.

Для javax.servlet.http.HttpServlet вы, вероятно, найдете файл класса внутри банки, названный как-то вроде servlet.jar или j2ee.jar. Есть чистая утилита под названием JFind, которая поможет вам найти, где можно найти класс - в обычной среде это также довольно легко.

Для вопроса 5, как упоминалось в других документах, оператор импорта просто импортирует класс или пакет в локальное пространство имен, что позволяет использовать удобное короткое имя HttpServlet вместо того, чтобы использовать длинное имя javax.servlet.http.HttpServlet каждый раз, когда вам нужно обратитесь к нему. Вы можете программировать на Java и никогда не использовать оператор импорта, если хотите, хотя люди, вероятно, будут смотреть на вас странно.

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