Как импорт сделан в Java?

Я пытался перейти на IntelliJ из-за новой Android Studio. Но сейчас я очень разочарован. Я использую Eclipse с плагином Code Recommanders . Вот простой пример того, почему Eclipse такой классный:

Я хочу создать новый SimpleTimeZone. SimpleTimeZone не имеет Конструктора с нулевыми аргументами.

Ctrl + Пробел в Eclipse

enter image description here

Ctrl + Пробел в IntelliJ

enter image description here

В IntelliJ я не получаю никакой информации о том, какие конструкторы SimpleTimeZone имеет.

После Enter в Eclipse

enter image description here

я получаю ранее выбранный конструктор, заполненный предопределенными именами переменных. И я могу видеть тип каждого аргумента. С помощью Code Recommanders Eclipse угадывает правильный конструктор по ранее определенным типам переменных в текущей области и заполняет конструктор этими переменными.

После Enter в IntelliJ ничего не происходит. Я получаю пустой конструктор. Мне нужно нажать Ctrl + P , чтобы увидеть ожидаемые аргументы.

enter image description here

19
задан Sinan Ünür 25 August 2009 в 17:21
поделиться

8 ответов

Я думаю, что вы, возможно, пытаетесь задать вопрос: «Что такое пакеты в Java и как ключевое слово import связано с ними?» . Ваше замешательство по поводу структур каталогов может быть связано с тем, что в некоторых других языках есть директивы include , которые используют имена файлов для буквального включения содержимого указанного файла в исходный код во время компиляции. C / C ++ являются примерами языков, которые используют этот тип директивы include . Ключевое слово Java import таким образом не работает. Как уже говорили другие, ключевое слово import - это просто сокращенный способ ссылки на один или несколько классов в пакете. Настоящая работа выполняется загрузчиком классов виртуальной машины Java (подробности ниже).

Пусть ' организация классов Java в пространства имен, похожие на модули Modula. Пакеты Java можно хранить в сжатые файлы, называемые файлами JAR, позволяя классам загружаться быстрее, поскольку группа, а не по одному. Программисты также обычно используют пакеты для организации классов, принадлежащих в ту же категорию или предоставляя аналогичная функциональность.

В Java файлы исходного кода для классов на самом деле организованы по каталогам, но метод, с помощью которого виртуальная машина Java (JVM) находит классы, отличается от таких языков, как C / C ++ .

Предположим, в вашем исходном коде есть пакет с именем "com.foo.bar", а внутри этого пакета есть класс с именем "MyClass". Во время компиляции расположение исходного кода этого класса в файловой системе должно быть {source} /com/foo/bar/MyClass.java , где {source} - корень дерева исходных текстов, которое вы компилируете.

Одно из различий между Java и такими языками, как C / C ++, - это концепция загрузчика классов. Фактически, концепция загрузчика классов является ключевой частью архитектуры виртуальной машины Java. Задача загрузчика классов - найти и загрузить любые файлы классов , необходимые вашей программе. «Первоначальный» или «стандартный» загрузчик классов Java обычно предоставляется JVM. Это обычный класс типа ClassLoader и содержит метод с именем loadClass () со следующим определением:

// Loads the class with the specified name.
// Example: loadClass("org.apache.nutch.plugin.Extension")
Class loadClass(String name)

Этот метод loadClass () будет пытаться чтобы найти файл class для класса с заданным именем, и он создает объект Class , который имеет метод newInstance () , способный создать экземпляр класса.

Где загрузчик классов ищет файл class ? В пути к классам JVM. Путь к классам - это просто список мест, где можно найти файлы class . Эти местоположения могут быть каталогами, содержащими файлы класса . Он может даже содержать файлы jar , которые сами могут содержать еще больше файлов class . Загрузчик классов по умолчанию может просматривать файлы jar для поиска файлов class . В качестве примечания, вы можете реализовать свой собственный загрузчик классов, например, чтобы разрешить поиск файлов class в сетевых (или любых других) местах.

Итак, теперь мы знаем, что или не "com.foo.bar.MyClass" находится в файле class в вашем собственном дереве исходных текстов или в файле class внутри файла jar где-нибудь в вашем классе path, загрузчик классов найдет его для вас, если он существует. Если его не существует, s загрузчик классов.

Для получения дополнительной информации о том, что именно делает загрузчик классов, я рекомендую прочитать статью под названием Основы загрузчиков классов Java

40
ответ дан 30 November 2019 в 02:18
поделиться

Все, что он делает, это экономит время, когда вы печатаете. Вместо того, чтобы вводить «org.apache.nutch.plugin.Extension» каждый раз, когда вы хотите его использовать, импорт позволяет вам ссылаться на него по его короткому имени «Extension».

Пусть вас не смущает слово «импорт» - это не загрузка файла .class или чего-то подобного. Загрузчик классов будет искать его в CLASSPATH и загружать в пермское пространство, когда это требуется вашему коду в первый раз.

ОБНОВЛЕНИЕ: Как разработчик вы должны знать, что пакеты связаны с каталогами. Если вы создаете пакет «com.foo.bar.baz» в своем .java-файле, его нужно будет сохранить в каталоге com / foo / bar / baz.

Но когда вы загружаете файл JAR, например эта библиотека Apache Nutch, с вашей точки зрения, здесь нет каталогов. Человек, создавший JAR, должен был заархивировать правильную структуру каталогов, которую вы можете увидеть как путь к файлу .class, если вы откроете JAR с помощью WinZip. Вам просто нужно поместить этот JAR в CLASSPATH для вашего приложения при компиляции и запуске.

14
ответ дан 30 November 2019 в 02:18
поделиться

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

Итак, если у вас есть «import java.util. *;» и в вашем коде вы делаете что-то вроде «new ArrayList ()», когда компилятор обрабатывает это выражение, ему сначала нужно найти полное имя типа ArrayList. Он делает это, просматривая список импорта и добавляя ArrayList к каждому импорту. В частности, когда он добавляет ArrayList в java.util, он получает FQN java.util.ArrayList. Затем он ищет этот FQN в своем пути к классам. Если он находит класс с таким именем, он знает, что имя java.util.ArrayList - правильное.

2
ответ дан 30 November 2019 в 02:18
поделиться

- это "org.apache.nutch.plugin" по существу 4 каталога?

Если у вас есть класс с именем org.apache.nutch.plugin.Extension , то он сохраняется где-нибудь в пути к классам как файл org / apache / nutch / plugin / Extension.class . Таким образом, корневой каталог содержит четыре вложенных подкаталога ("org", "apache", "nutch", "plugin"), которые, в свою очередь, содержат файл класса.

1
ответ дан 30 November 2019 в 02:18
поделиться

import org.apache.nutch.plugin.Extension - это ярлык времени компиляции, который позволяет вам обращаться к классу Extension без использования полного имени класса. Это не имеет значения во время выполнения, это всего лишь уловка во время компиляции, чтобы сохранить ввод.

По соглашению файл .class для этого класса будет расположен в папке org / apache / nutch / plugin либо в файловой системе, либо в jar файл, любой из которых должен находиться в вашем пути к классам как во время компиляции, так и во время выполнения. Если файл .class находится в файле jar, тогда этот файл jar должен быть в вашем пути к классам. Если файл .class находится в папке, то папка, которая является родительской для папки «org», должна находиться в вашем пути к классам. Например, если класс находился в папке c: \ myproject \ bin \ org \ apache \ nutch \ plugin, тогда папка c: \ myproject \ bin должен быть частью пути к классам.

Если вы хотите узнать, откуда был загружен класс при запуске вашей программы, используйте java-команду -verbose: class вариант линии. Он должен сообщить вам, в какой папке или jar-файле JVM нашла класс.

1
ответ дан 30 November 2019 в 02:18
поделиться

Отказ от ответа Томаса , org.apache.nutch.plugin - это путь к файл (ы) класса, который вы хотите импортировать. Я не уверен насчет этого конкретного пакета, но обычно у вас будет файл .jar, который вы добавляете в свой путь к классам, а ваш оператор импорта указывает на каталог "./[classpath ]/[jarfile ]/org/apache/ Nutch / plugin "

0
ответ дан 30 November 2019 в 02:18
поделиться

Обычно, когда вы создаете класс, вы можете объявить его частью пакета. Лично у меня нет большого опыта в создании пакетов. Однако, черт возьми, это в основном означает, что вы импортируете класс Extension из пакета org.apache.nutch.plugin.

0
ответ дан 30 November 2019 в 02:18
поделиться

у вас не может быть каталога с именем org.apache как пакет. компилятор не поймет это имя и будет искать структуру каталогов org / apache , когда вы импортируете какой-либо класс из этого пакета.

также не ошибайтесь с Java import с инструкцией препроцессора C #include . оператор import , как они сказали, является сокращением, позволяющим вводить меньше символов при обращении к имени класса.

0
ответ дан 30 November 2019 в 02:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: