2013-01-19 80 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的:它使用的元類對象等,並能在自身實現幾乎所有語言的一個很好的例子。