2013-08-15 3 views
0

Я читал, что в отличие от C/C++, когда мы «импортируем» пакеты, они фактически не добавляются (они передаются вместо встраивания) в файл класса.Импорт в Java

Каковы последствия этого из-за этого?

Мне любопытно узнать о накладных расходах (вызывной ток в упомянутых пакетах и ​​т. Д.), Которые могут возникнуть из-за того, что упомянутые данные (из пакетов) недоступны в самом классе.

Или накладные расходы крайне минимальны?

+0

Вы упомянули, что способ импорта в C/C++ отличается от Java. Это я уже знаю – UnderDog

+0

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

+0

Что многие разработчики из C/C++ находят, что сначала нарушают Java, так это то, что производительность не является чем-то, о чем вам нужно беспокоиться, так как б) это то, что вам нужно только измерить в запущенной программе, прежде чем принимать решение, c) не может сделать а если окажется, что есть проблема (что редко, но разочаровывает), то Java лучше понять как язык (хотя JVM очень сложный) и убрать многие из общих проблем, которые вы могли бы волноваться о языках на более низком уровне. –

ответ

5

Нет хитов о производительности. Это влияет только на то, как компилятор разрешает типы; нет никаких последствий для генерируемого кода байта или информации, доступной во время выполнения. Он почти точно эквивалентен using [namespace] в C++ (где пакеты похожи на пространства имен).

Как и C++, вы также можете полностью квалифицировать тип с его пакетом вместо его импорта.

C++:

Something::Whatever x = ...; 
// or 
using namespace Something; 
Whatever x = ...; 

Java:

com.something.Whatever x = ...; 
// or 
import com.something.*; 
Whatever x = ...; 

Вы можете (и должны) также импортировать определенный тип:

C++:

using Something::Whatever; 

Java:

import com.something.Whatever; 

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

Обратите внимание, что в отличие от C++ using namespace, import должен быть в верхней части файла. Кроме того, имена пакетов напрямую отражают структуру каталогов источника относительно пути к классам (разделители путей заменяются точками); потому что классы могут динамически загружаться в Java, имя пакета также указывает, где в файловой системе класс загрузчик ищет класс.

Кроме того, чтобы выбрать гниды, в C. такой концепции нет.

+1

+1 для гнид. – andy256

2

Не существует накладных расходов на производительность при добавлении пакетов. Но вы не должны просто импортировать ненужные пакеты в свой код. Иногда есть классы с тем же именем, но в разных пакетах, поэтому вы столкнетесь с ненужными проблемами.

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

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

+1

Могу ли я узнать причину отрицательного голоса здесь? –

+0

Я хотел бы также знать, это вполне верный ответ. –

1

Перегрузщик классов Java загружает класс в память только тогда, когда это необходимо. Он не загружает классы в память после импорта, см. Это answer.. Для этого нет «снижения производительности» ... когда нужно получить доступ к байт-коду класса, адрес в памяти почти наверняка будет получен в постоянное время.

1

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

Декларация импорт делает тип или член, доступные их простых имен только в пределах единицы компиляции, которая фактически содержит объявление импортировать

1

Если класс хочет для использования другого класса в одном пакете имя пакета не нужно использовать. Классы в одном пакете обнаруживают друг друга без специального синтаксиса.

для примера: в нашей программе, если мы скажем импорт java.util. *; это означает, что мы импортируем все классы внутри пакета java.util в наш текущий класс, и мы можем использовать эти классы здесь.

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

+0

** он не включает классы ... он перенаправляет внимание компиляторов .. ** – Abhishek