1

对象位于 Java 类的顶部。String 是 Object 的子类。

那么,什么是第一个 - 对象或字符串?

迅速的答案是——对象。

但有趣的是,Object 已经有一个 toString() 方法,因此“知道”String。因此,在构造 Object 时,String 必须已经存在。另一方面,String 是 Object 的子类,在构造 String 时,Object 必须已经存在。我们陷入了一个永无止境的定义周期(还有一些技术问题)。这种方法至少违反了单一根类的想法。

这种担忧可能看起来更像是理论上的,而不是实际的。

但问题是我在其他框架中看到了类似的方法。我认为至少在某种程度上它受到了核心 Java 类的设计方式的启发。

你怎么看 - Java 类之间的循环依赖(特别是在对象/字符串的情况下)是不可避免的吗?难道不应该不惜一切代价避免它们吗?还是有时(谨慎和谨慎地)作为合理妥协的结果而接受它们?如果,那么 - 标准是什么?

4

5 回答 5

5

Java 没有单遍编译器,而是多遍编译器。

这意味着一起编译的所有类实际上都处于声明级别。即使它们具有循环依赖关系,这些也会在第一步中得到解决,因此Object类提供toString方法这一事实在概念上并不意味着与拥有或更少的根类有关。

由于我们讨论的是理论问题,因此类声明与真正的根类之间的关系很容易解决:

Object是根类只是因为String继承自它。

String toString()只不过是对编译器授予类型安全有用的签名,Object不需要String对象,甚至不需要知道 aString是什么。

于 2013-01-19T21:13:18.217 回答
2

我认为之间的循环依赖不一定是一个问题,并且经常发生(出于可靠的设计原因)。假设您有一个相互了解的树和一个节点,或者一个链表和一个节点等。在这种情况下,循环依赖是完全合理的。

我不太喜欢的是模块之间的循环依赖。这些通常可以并且在我看来应该避免。

于 2013-01-19T21:12:51.707 回答
1

由于 Object 和 String 都在 Java 的第一个版本中,我认为它们是同时出现的。

于 2013-01-19T21:10:31.417 回答
1

您所描述的“问题”听起来好像您认为 Java 是一种脚本语言,其中一个必须首先声明,另一个才能在其范围内,但事实并非如此,因为 Java 是一种编译语言,这意味着这种依赖关系在编译时解决。

于 2013-01-19T21:14:35.227 回答
0

没有矛盾。

对象是指它自己的一个子类。这并不违法,因为与 chicken 相比,Strings 不必从 Objects 中“开发”出来,它们的类只需要 Object 类进行构造,因此两者都必须在编译时可用。

如果您想混淆鸡蛋,请看一下 Smalltalk:它使用元类对象等,并且是几乎所有语言都可以自己实现的一个很好的例子。

于 2013-01-19T21:22:31.110 回答