Java中的’import’与C / C ++中的’#include’

Java中的’import’与C / C ++中的’#include’的行为方式相同吗? 具体来说,它是否包含它正在导入的整个库,还是只包含后续代码中调用的类和方法?

#include既不会同时执行“导入”库,也不会执行类或模块。

#include指令只是告诉预处理器包含另一个文本文件(源)的内容。 就这样。

预处理文件A #include ing文件B的结果传递给编译器,好像它们是一个文件一样,文件B粘贴到放置#include指令的位置的文件A中。

对于expliclity说明:这一切都发生任何编译,代码生成之前。

作为副作用,C / C ++预处理器可以独立于编译器使用,以处理任何类型的文本文件输入。

有人可能会说像#include “这样的预处理器语句并不是C / C ++语言的真正组成部分”,因为它们在C / C ++中编写任何程序并不是必需的,因为它们永远不会传递给编译器。

表达式import不在(标准)C / C ++编程的上下文中使用,因为没有要导入的内容。

C / C ++模块编译之前在源级别上或编译之后由链接器组合在一起。

#include表示在此文件中复制#include的内容,而import java.util.ArrayList表示如果在此文件中找不到类,请查看上述导入位置。 Java导入不会增加文件的大小,只会节省很少的击键次数。

在Java中,当您使用import ,您可以导入:

  • 单个类: import foo.bar.Baz
  • 一个完整的包: import foo.bar.*
  • 类的一个静态成员: import static foo.bar.Baz.GRUT
  • 类的每个静态成员: import static foo.bar.Baz.*

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/

取决于你实际导入的内容。 最小的可导入实体是类,最大的是包。
因此,如果您需要一个类并导入完整的包,它将引入完整的包。

我认为关于c的其他答案可能尚未解决的一个方面是,

include中的c只复制包含函数原型的预处理器阶段中的头文件,仅此而已。 在基本代码编译之后,实际的函数定义仍然位于链接时。

可以通过包含头文件而不是源文件并从代码中调用函数来完成简单的validation。 不会出现编译错误,只有在链接时它会抱怨无法找到定义

import(在Java中)类似于using(在C ++中) – 正如您所理解的那样,它们并不完全相同,但非常相似。

import用于指示编译器在何处可以找到当前类中使用的类(或子包)。

包括 – 斯文在这里解释得更好 – https://stackoverflow.com/a/3739563/135553

笼统 :

在c语言中,当编译器遇到#include语句时,所有指定的头文件将仅在include语句时加载,而不管我们是否使用这些头文件。 因此它被称为静态绑定。

但是在java语言的情况下,当编译器遇到import语句时,将不会在import语句时加载.class文件。 在下一行代码中,每当我们使用类时,只会加载相应的.class文件。 这种类型的加载称为动态加载或按需加载或即时加载。

include通常是指C,C ++ lang,它们是平台相关语言,需要直接编译,链接和加载到机器的架构指令集,但是当import引用java lang时,它是独立于平台的,它可以生成字节代码,然后它可以解释为二进制代码格式。