';导入&x27;在Java与&x27#包括';在C/C++;

';导入&x27;在Java与&x27#包括';在C/C++;,java,c++,c,import,include,Java,C++,C,Import,Include,Java中的“导入”行为是否与C/C++中的“包含”行为相同?具体地说,它将包括正在导入的整个库,还是只包括在后续代码中调用的类和方法?取决于实际导入的内容。最小的可导入实体是类,最大的是包。 因此,如果您需要单个类并导入完整的包,它将带来完整的包。#include既不“导入”库,也不“导入”类或模块 #include指令只是告诉预处理器包含另一个文本文件(源)的内容。就这些 预处理文件A#include的结果将文件B作为一个文件传递给编译器,文件B粘贴到文件A中放置#include指令的位置

Java中的“导入”行为是否与C/C++中的“包含”行为相同?具体地说,它将包括正在导入的整个库,还是只包括在后续代码中调用的类和方法?

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

#include
既不“导入”库,也不“导入”类或模块

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

预处理文件A
#include
的结果将文件B作为一个文件传递给编译器,文件B粘贴到文件A中放置
#include
指令的位置

为了说明这一点:这一切都发生在编译、代码生成之前

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

有人可能会说,像
#include
这样的预处理器语句“实际上不是C/C++语言的一部分”,因为用C/C++编写任何程序都不需要它们,因为它们永远不会传递给编译器

表达式
import
不用于(标准)C/C++编程环境中,因为没有要导入的内容


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

在Java中,使用
导入时,可以导入:

  • 单个类:
    import foo.bar.Baz
  • 完整的软件包:
    import foo.bar.*
  • 类的单个静态成员:
    import static foo.bar.Baz.GRUT
  • 类的每个静态成员:
    导入静态foo.bar.Baz.
C/C++
#include
指令发生在预处理阶段,用简单的英语表示“在此处粘贴作为参数给出的整个头文件(或任何文本文件,如果您愿意)”。新的C++标准将有模块(最后),并且可能与java的导入类似(取决于它将如何实现)。关于C++建议的更多内容:


Java8还将改进对模块化编程的支持。请看:

我认为关于c,其他答案可能没有澄清的一个方面是

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


通过包含头文件(而不是源文件)并从代码中调用函数,可以完成简单的验证。没有编译错误,只有在链接时会抱怨不能找到定义。

通常指的是C、C++ +,它们是依赖于平台的语言,需要编译、链接和加载到体系结构的机器指令集,但是导入指的是java LAN,它是独立于平台的,可以生成字节码,然后可以解释为二进制码格式。

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

导入(在Java中)与使用(在C++)类似 据你所知,它们并不完全相同,但非常相似

导入是指编译器可以在哪里找到当前类中使用的类(或子包)

include-Sven在这里解释得更好-

一般来说:

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


但对于java语言,当编译器遇到import语句时,不会在import语句时加载类文件。在接下来的代码行中,无论何时使用类,都只会加载相应的.class文件。这种类型的负载称为动态负载或按需负载或动态负载

#include
ing不是在编译时发生的,而是在编译之前。我不想详细介绍C/C++编译器如何处理源代码,这完全是离题的。你同意吗?尽管如此,评论还是公平的,所以+1。在寻找Java的
import
语句和C的
#include
指令(正如OP所质疑的)之间的差异的背景下,我认为指出C/C++预处理器不是任何编译或代码生成的一部分并不离题,但是,一个重要的事实需要提及。无论如何,1的提到可能的即将改变的经典C/C++方法,至少对于C++。@代码y>包含< < /C> >指令只包括文本文件,不管这个文件包含什么。后者完全留给程序员,可以包含任何类型的定义。不过有几点。预处理器不是只复制包含函数原型的头文件,并且在链接时包含实际的源文件吗?上面的内容使它听起来像是由预处理器粘贴的实际源,我认为情况并非如此。我想问的另一点是,如果java中的导入不同,会发生什么情况?编译器的性能如何