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

时间:2012-11-22 17:32:21

标签: java c++ c import include

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

9 个答案:

答案 0 :(得分:25)

#include不执行任何操作,既不“导入”库,也不执行类或模块。

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

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

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

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

有人可能会说像#include这样的预处理器语句实际上不是C / C ++语言的一部分“,因为它们在C / C ++中编写任何程序都不是必需的,因为它们从未通过到编译器。

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

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

答案 1 :(得分:8)

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

答案 2 :(得分:7)

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

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

答案 3 :(得分:2)

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/

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我认为其他答案可能尚未清除的一个方面是,

  

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

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

答案 6 :(得分:0)

import(在Java中)类似于using(在C ++中) - 如你所知,它们并不完全相同,但非常相似。

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

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

答案 7 :(得分:-1)

一般而言:

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

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

答案 8 :(得分:-2)

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