2013-01-19 81 views
0

对象位于Java类的顶部。 String是Object的一个子类。Java中的鸡或鸡蛋难题

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

提示答案是 - 对象。

但有趣的是对象已经有一个方法toString(),从而“知道”有关String。所以,当构造Object时,String必须已经存在。另一方面,String是Object的一个子类,当构造String时Object必须已经存在。我们陷入了永无止境的定义循环(也有一些技术问题)。这种方法至少违背了单个根类的想法。

这个问题可能看起来相当理论化而非实际。

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

你认为 - 一般Java类之间的循环依赖(特别是在Object/String的情况下)是不可避免的吗? 不应该不惜任何代价避免它们? 或者作为合理妥协的结果,它们有时可以被接受(谨慎和谨慎)?如果,那么 - 什么标准?

+1

我知道!这是一个笑话... :) –

+0

@Orabîg没问题。笑话是受欢迎的。 –

回答

5

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

这意味着所有编译在一起的类实际上都处于声明级别。即使他们有循环依赖关系,这些问题也可以在第一步中解决,因此Object类提供toString方法这一事实在概念上并不意味着具有或少于根类的任何事情。

既然我们谈到理论问题,这是真正的根类是很容易解决的类声明和之间的关系:

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

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

+0

那么,如果不需要知道String是什么,它是如何计划从toString()方法返回一个String类型的对象?至少Object应该能够构造一个String实例并返回它。如果没有一些关于字符串的知识,怎么做呢? –

+0

我只是想澄清。无论如何,先生,你的答案看起来像最好的答案,所以我会等待一段时间,最有可能接受它(加上其他好答案的投票)。 –

1

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

1

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

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

1

“问题”为你所描述的声音,如果你认为Java是一种脚本语言,其中一个必须首先宣布为对方是在它的范围,但由于Java是不是这种情况下,编译语言,这意味着这些依赖关系在编译时被解决。

+0

经过近15年的Java编程,我不相信Java是一种脚本语言,并且知道(至少在某种程度上)它是如何工作的。问题不是如何,而是为什么。 –

0

没有矛盾。

对象指它自己的一个子类。这不是非法的,因为与鸡不同,Strings不必从Object中“开发出来”,它们的类只需要Object类进行构造,所以它们都必须在编译时可用。

如果你想鸡蛋的困惑,看看Smalltalk的:它使用的元类对象等,并能在自身实现几乎所有语言的一个很好的例子。