39

私はかなり長い間Javaでプログラミングを行ってきましたが、友人にクラスとは何かを説明しようとしたときjava.lang.Object、単純なワンライナー以上のものを思いつくことができませんでした:

java.lang.ObjectJava のすべてのオブジェクトは暗黙的に拡張されます

なぜそうする必要があるのか​​ よくわかりませんでした。

そこで、 GrepCodeのソース コードを調べて、手がかりを見つけられることを期待しました。これで、 ajava.lang.Objectとは何か、それが何をするのかがわかったので、なぜこのように設計されたのかについて特定の理由があるかどうかを知りたい.

私の質問はまだ優勢です: なぜすべてのオブジェクトが拡張する必要があるのjava.lang.Objectですか?

4

11 に答える 11

43

その理由は、Javaのすべてのオブジェクトに共通のAPIを用意して、次のような基本的な機能をサポートするためだと思います

  • 同期- waitnotifynotifyAll
  • ガベージ コレクション-finalize
  • コレクションサポート- hashCodeequals
  • オブジェクトの複製-clone

そしてすべてのオブジェクト

  • 属するクラスを持っている -getClass
  • 私たちは人間であり、文字列を読み取ることができるため、文字列として表すことができます -toString
于 2013-10-01T11:40:21.933 に答える
9

これが言語の設計方法です。すべてのオブジェクトは基本クラスから継承されますObject。これは、すべてのオブジェクトに対してtoString()equals()hashCode()、 などの特定のメソッドが存在することが保証されていることを意味します。

于 2013-10-01T11:34:42.087 に答える
5

すべてのクラスは暗黙的に Object クラスを拡張し、Java の推奨に従ってすべてのクラスが持つべき基本機能を提供します。clone()、equals()、hashCode()、toString() など。

暗黙的にとは、クラスを拡張していない場合、コンパイラーのみが暗黙的にオブジェクトクラスを拡張することを意味します。ただし、クラスが既に他のクラスを拡張している場合、コンパイラーはオブジェクトクラスを拡張しません。たとえば。クラスA{ }

クラス B は A{ } を拡張します

ここで、コンパイラはクラス A 宣言に extends Object クラスを暗黙的に追加します。

クラス Aは Object { }を拡張します

クラス B は A{ } を拡張します

クラス A は Object クラスを拡張するので、 equals() 、 toString() などの Object クラスの基本機能を提供します。また、クラス B はクラス オブジェクトを暗黙的に拡張するクラス A を拡張するため、クラス B もこれらすべての機能を提供します。

したがって、このアプローチに従うことで、すべてのクラス オブジェクト (変数) は、Java が許可しない複数の継承 (複数のクラスを拡張するクラス) を使用することなく、すべての Java オブジェクトが持つべき機能に準拠します。このアプローチは、マルチレベル継承に従います。

于 2014-01-24T10:36:45.410 に答える
4

これは、toString() などの基本的な関数のほとんどが自動的に継承されるように行われます。次の質問に対して、これは多重継承ではなく、複数レベルの継承です...多重継承では、単一のクラスは 2 つ以上の基本クラスから派生しますが、あなたが言ったようにマルチレベルでは、それ自体がオブジェクトクラスから派生した基本クラスを持っています

于 2013-10-01T12:46:51.767 に答える
3

Head first Java 2nd edition の引用:

Java のすべてに共通のスーパークラスがなければ、Java の開発者が独自の型を取ることができるメソッドを持つクラスを作成する方法はありません...彼らが ArrayList クラスを書いたときには知らなかった型です。

これは本質的に、言語によって提供されるさまざまな機能を実装するために使用できる、Java での汎用の定義済みクラス型の必要性を説明しています。

于 2016-09-05T14:09:40.140 に答える
2

これは Java の設計上の決定です。継承と再利用の概念を利用します。これにより、すべてのクラスになどの基本的なメソッドが含まれるようwait()になります。toString()

于 2013-10-01T11:36:10.670 に答える
2

ドキュメントを参照してください:

java.lang パッケージの Object クラスは、クラス階層ツリーの最上位にあります。すべてのクラスは、Object クラスの直接的または間接的な子孫です。使用または作成するすべてのクラスは、Object のインスタンス メソッドを継承します。これらのメソッドを使用する必要はありませんが、使用する場合は、クラス固有のコードでオーバーライドする必要がある場合があります。

クラスは、すべてのObjectオブジェクトが持たなければならない基本的な状態を定義するだけです-他のオブジェクトと比較するように。

すべてのクラスです。すべての派生オブジェクトに一種のテンプレートを提供するだけです。

于 2013-10-01T11:34:31.283 に答える
2

オブジェクトクラスは Java プログラミングの最もスーパーなクラスで、型ごとに定義済みのメソッドがあり、それらのメソッドを利用することができます。& オブジェクトクラスを拡張する必要はもうありません & 暗黙的にそこにある場所ならどこでも

于 2013-10-01T12:06:19.057 に答える