1

オブジェクトは Java クラスの上にあります。String は Object のサブクラスです。

では、オブジェクトと文字列のどちらが最初だったのでしょうか?

即答は - オブジェクトです。

しかし、興味深いことに、Object には既にメソッド toString() があり、したがって String について「認識」しています。そのため、Object が構築されるとき、String はすでに存在している必要があります。一方、String は Object のサブクラスであり、String が構築されるとき、Object は既に存在している必要があります。私たちは終わりのない定義サイクルに陥ります (そして技術的な問題もあります)。このようなアプローチは、少なくとも単一のルート クラスの考え方に反します。

懸念事項は、実用的というよりはむしろ理論的なものに見えるかもしれません。

しかし、問題は、他のフレームワークでも同様のアプローチが見られることです。少なくともある程度は、コア Java クラスの設計方法に触発されたと思います。

Java クラス間の循環依存関係は一般的に (特にオブジェクト/文字列の場合) 避けられないと思いますか? 何としても避けるべきではないでしょうか。それとも、合理的な妥協の結果として、(慎重に慎重に) 受け入れることができるでしょうか? もしそうなら、基準は何ですか?

4

5 に答える 5

5

Java には、ワンパス コンパイラではなく、マルチパス コンパイラがあります。

これは、一緒にコンパイルされるすべてのクラスが実際には宣言レベルであることを意味します。それらに循環依存関係がある場合でも、これらは最初のステップで解決されるため、Objectクラスがメソッドを提供するという事実は、toString概念的には、ルート クラスの有無に関連して何も意味しません。

理論的な問題について話しているので、クラス宣言と実際のルート クラスとの関係は簡単に解決できます。

ObjectStringが継承されているという理由だけでルート クラスです。

TheString toString()は、コンパイラが型安全性を付与するのに役立つ署名でObjectあり、Stringオブジェクトを必要とせず、aStringが何であるかを知る必要さえありません。

于 2013-01-19T21:13:18.217 に答える
2

クラス間の循環依存は必ずしも問題ではなく、かなり頻繁に発生すると思います(確かな設計上の理由から)。お互いを認識しているツリーとノード、またはリンクされたリストとノードなどがあるとします。このような場合、循環依存は完全に合理的です。

私があまり好きでないのは、モジュール間の循環依存関係です。これらは一般的に避けることができ、私の見解では避けるべきです。

于 2013-01-19T21:12:51.707 に答える
1

あなたが説明している「問題」は、Javaがスクリプト言語であると信じているかのように聞こえますが、Javaはコンパイルされた言語であるため、Javaはコンパイルされた言語であるため、そうではありません。このような依存関係はコンパイル時に解決されます。

于 2013-01-19T21:14:35.227 に答える
1

Since both Object and String were in the first version of Java, I think they both came at the same time.

于 2013-01-19T21:10:31.417 に答える
0

矛盾はありません。

オブジェクトはそれ自体のサブクラスを参照します。チキンとは対照的に、文字列はオブジェクトから「開発」する必要はなく、それらのクラスは構築のためにオブジェクトクラスを必要とするだけなので、コンパイル時に両方が利用可能でなければならないため、これは違法ではありません.

鶏卵の混乱が必要な場合は、Smalltalk をご覧ください。これは、Metaclass オブジェクトなどを使用しており、言語のほぼすべてをそれ自体で実装できる非常に良い例です。

于 2013-01-19T21:22:31.110 に答える