我有一个问题,除了以下不符合我要求的答案外,我没有找到答案:
“因为詹姆斯·高斯林不想”
我知道Java可以有接口(只有纯虚函数,没有属性),但这与类定义不完全一样。
我有一个问题,除了以下不符合我要求的答案外,我没有找到答案:
“因为詹姆斯·高斯林不想”
我知道Java可以有接口(只有纯虚函数,没有属性),但这与类定义不完全一样。
Answers:
以下答案不符合我的要求:“因为James Gosling不想这样做。”
不过,这是正确的答案。语言设计团队(Gosling,Sheridan,Naughton,后来的Bill Joy,Ken Arnold等)认为标头引起的问题比他们解决的更多。因此,他们设计了它们,并证明了他们可以创建一种不需要它们的完全有用的语言。
用Java编写的源代码很简单。没有预处理器,没有#define和相关功能,没有typedef,并且没有这些功能,不再需要头文件。Java语言源文件提供了其他类及其方法的定义,而不是头文件。
冗余定义,保持文件同步,定义冲突,隐藏定义-在Java中这些都不会发生,因为您没有标题。如果要查看裸类定义,则可以直接从.java文件生成一个类定义-例如,大多数IDE会在边栏中显示类的结构,这等同于同一件事。
在C ++中,真正不需要在单独的文件中包含类定义和声明。这仅意味着,至少在C天之内,您可以对代码进行一次上下扫描来进行解析。在没有随机访问存储的机器上,这很重要!
具有标头还允许您通过提供标头来将接口发布到代码库,而无需透露源代码。不幸的是,在C ++中,您还必须揭示导致出现诸如pimpl恐怖之类的解决方案的私有数据成员。
已经尝试建立一个C ++环境,其中所有内容都存储在数据库类型结构中,没有文件,但没有流行。
由于DRY原理。在Java中,使用包(或类)中的类所需的信息包含在.class文件中。创建包含相同信息的单独的头文件将涉及在两个地方重复。
在每种语言中,创建最终的二进制代码都有两个阶段-编译和链接(当然,有加载,但是在这里影响不大)。在编译时,只需要在适当的位置放置钩子(将要调用的函数的规范)即可。当两个真实代码都可用时,链接器实际上将它们加入。到目前为止,C ++和Java之间没有区别。
还有就是然而,需要C ++有声明和定义分开。如果将实现保留在头文件中,并且头文件发生更改,则需要重新编译与其链接的代码。好像定义在单独的文件中一样,只需重新链接代码即可。
了解C ++确实具有静态链接的选项,这意味着目标代码与调用应用程序一起固定。请注意,在C和C ++中,在头文件中进行编程甚至执行#include都是无效的。这仅意味着您需要考虑如何与这些目标文件进行链接。
Java中的情况非常不同。每个类文件都使用.class文件进行编译。确实,需要在.class文件中用作标头部分的调用方类函数编译。但是,在Java中,仅在给定类文件字节码指定的情况下,仅在运行时(虚拟机)内部完成最终链接。