it-swarm.com.ru

"импорт" в Java против "#include" в C/C++

Действует ли «импорт» в Java так же, как «#include» в C/C++? В частности, будет ли он включать всю библиотеку, которую он импортирует, или он будет просто включать классы и методы, которые вызываются в последующем коде?

19
Eamon Moloney

#include не выполняет ни того, ни другого, ни «импорта» библиотек, ни классов, ни модулей.

Директива #include просто указывает препроцессору включать содержимое другого текстового файла (источника). Это все.

Результат предварительной обработки файла A #includeing файла B передается компилятору, как если бы они были одним файлом, а файл B вставляется в файл A в месте, где была размещена директива #include.

Чтобы объяснить это следующим образом: все это происходит до с любой компиляцией, генерацией кода.

В качестве побочного эффекта препроцессор C/C++ может использоваться независимо от компилятора для обработки любого вида ввода текстового файла.

Можно утверждать, что операторы препроцессора, такие как #include, «на самом деле не являются частью языков C/C++», поскольку они по сути не нужны для написания каких-либо программ на C/C++, поскольку они никогда не передаются компилятору.

Выражение import не используется в контексте (стандартного) программирования на C/C++, так как нечего импортировать. 

Модули C/C++ собираются либо на уровне исходного кода до до компиляции, либо с помощью компоновщика после компиляции.

24
alk

#include<stdio.h> означает скопировать содержимое stdio.h в этот файл, while import Java.util.ArrayList означает, что если вы не можете найти класс в этом файле, посмотрите вышеупомянутое местоположение импорта. Импорт Java не увеличивает размер вашего файла, он просто экономит несколько нажатий клавиш.

8
Ajay Sharma

В Java, когда вы используете import, вы импортируете либо:

  • один класс: import foo.bar.Baz
  • полный пакет: import foo.bar.*
  • один статический член класса: import static foo.bar.Baz.GRUT
  • каждый статический член класса: import static foo.bar.Baz.*
6
Jerome

Директива C/C++ #include происходит на этапе предварительной обработки, и на простом английском языке это означает, что «здесь вставьте весь заголовочный файл (или любой текстовый файл, если хотите), который указан в качестве параметра». Новый стандарт C++ будет иметь модули (наконец), и может быть или не быть похожим на импорт Java (зависит от того, как он будет реализован). Подробнее об этом предложении C++: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3347.pdf

В Java 8 также будет улучшена поддержка модульного программирования. Смотрите: http://openjdk.Java.net/projects/jigsaw/

2
DejanLekic

В общих чертах:

В языке c, когда компилятор сталкивается с оператором #include, все указанные файлы заголовков будут загружаться только во время оператора include, независимо от того, используем мы эти файлы заголовков или нет. Следовательно это называется статическим связыванием.

Но в случае языка Java, когда компилятор встречает оператор импорта, файл .class не будет загружен во время оператора импорта. В следующих строках кода всякий раз, когда мы используем класс, будет загружен только соответствующий файл .class. Этот тип загрузки называется динамической загрузкой или загрузкой по требованию или загрузкой на лету. 

0
Abhishek Luthra

Зависит от того, что вы на самом деле импортируете. Самый маленький импортируемый объект - это класс, самый большой - пакет.
Таким образом, если вам нужен один класс и импортируйте полный пакет, он принесет полный пакет.

0
Germann Arlington

import (в Java) аналогичен использованию (в C++) - Как вы понимаете, они не совсем одинаковы, но очень похожи.

import должен указать компилятору, где он может найти класс (или подпакет), используемый в текущем классе.

включите - Свен объяснил это лучше здесь - https://stackoverflow.com/a/3739563/135553

0
Narendra N

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

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

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

0
fayyazkl