4

在java中,您可以在类中声明一个方法,然后在类中或类外定义它吗?

我正在寻找类似于 C++ 的东西,您在其中声明它然后使用类外的 :: 格式稍后定义它?

另外,不要重载方法。

4

2 回答 2

5

C++ 成员函数永远不会在“类之外”定义。前缀将Class_Name::它们放在类中。他们只是不在类声明中。

在 C++ 中拆分声明和定义是必要的,因为单独的编译模型基于文本文件包含。无法从编译的目标文件中提取有关类的详细信息,因此类型信息的简明摘要被分解到头文件中,并且该类的所有客户端模块都必须包含该信息。Java 有一种更复杂的对象文件格式,它可以在没有头文件的情况下获取有关类的信息。

语言中出现的另一个声明需求是处理函数之间的相互递归或其他形式的循环引用的情况(例如,它们在 Wirth 的原始 Pascal 语言中需要,该语言不支持将程序拆分为单独的模块)。Java 无需前向声明即可实现相互递归。您只需将类型检查推迟到完整解析。Pascal 中的前向声明不是为了使相互递归成为可能,而是为了使一次编译它成为可能,这样您就可以在编译下一个函数之前为一个函数发出代码。(当您的硬件是在 1968 年制造时,这一点很重要。)

如果您使用的语言不需要声明,为什么还要寻找一种方法将它们放回原处?这就像你被释放后继续吃监狱的食物。(这可能是“习得性无助”的一个例子。)

无论如何,几十年来类型系统的最新技术已经被标记为尽可能避免声明并依赖类型推断的设计。看看你必须用 C++ 写多少次类名才能完成任何事情。class myclass { public: myclass(); }; myclass::myclass() { /* constructor */ }. 四次重复myclass只是为了创建一个什么都不做的虚拟类,并使用在类声明之外定义的构造函数。

于 2012-04-19T21:07:13.680 回答
3

你不能在 Java 中做到这一点。每当您声明一个非抽象方法时,您还必须定义它。抽象方法没有定义,所以它们超出了这个问题的范围。

于 2012-04-19T20:41:17.043 回答