web-dev-qa-db-ja.com

Java内のすべてのオブジェクトがJava.lang.Objectクラスを暗黙的に拡張するのはなぜですか?

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

Java内のすべてのオブジェクトがJava.lang.Objectを暗黙的に拡張します

なぜそうすべきなのか、私にはよくわかりませんでした。

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

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

36
codeMan

Javaのすべてのオブジェクトに共通のAPIを使用して、

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

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

  • 属しているクラスがある-getClass
  • 私たちは人間であり、文字列を読み取ることができるため、それ自体を文字列として表すことができます-toString
39
René Link

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

9

Objectの最も重要な使用法は、toString()のような一般的なメソッドを提供することではなく、すべての参照型を保持する一般的なtypeを提供することです。

C++にはObjectに相当するものがなく、人々はまだ満足しています。しかし、JavaにはポインタとC++のようなテンプレートがないため、Objectsなどの実装を可能にするためにはCollectionが必要です。

参照型とプリミティブ型に関する説明も参照してください。

8
billc.cn

Designと言います。すべてのObjectがそこに記述し、そのクラスを言語仕様として拡張することをサポートする必要がある共通/必須メソッド。

その理由は、ここ 公式ドキュメント にあります。

これがObjectであると言う場合、APIによって定義/決定された共通のメソッドが必要です。

独自のすべてのクラスについて、以下のメソッドを想像してください。

protected Object clone() throws CloneNotSupportedException
      Creates and returns a copy of this object.


public boolean equals(Object obj)
      Indicates whether some other object is "equal to" this one.


protected void finalize() throws Throwable
      Called by the garbage collector on an object when garbage
      collection determines that there are no more references to the object


public final Class getClass()
      Returns the runtime class of an object.


public int hashCode()
      Returns a hash code value for the object.


public String toString()
      Returns a string representation of the object.

Objectのnotify、notifyAll、およびwaitメソッドはすべて、プログラムで独立して実行されているスレッドのアクティビティを同期する役割を果たします。

public final void notify()
public final void notifyAll()
public final void wait()
public final void wait(long timeout)
public final void wait(long timeout, int nanos) 

そこで、痛みを軽減するために、共通で標準的なAPIを作成しました。

5
Suresh Atta

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

4
Nawed Shaikh

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

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

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

ここでコンパイラは、クラスA宣言に暗黙的に拡張オブジェクトクラスを追加します。

クラスA オブジェクトを拡張 {}

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

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

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

3
user1425349

最初に引用ヘッドJava第2版:

Javaのすべてに共通のスーパークラスがなければ、Javaの開発者がカスタムタイプを取ることができるメソッドを含むクラスを作成する方法はありません...彼らがいつ知っていたのかわからないタイプArrayListクラスを作成しました。

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

2
Aaditya

docs を参照してください:

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

Objectクラスは、allオブジェクトが持っている必要がある基本的な状態を定義するだけです-他のオブジェクトと比較するように。

すべてのparentクラスです。それは単にすべての派生オブジェクトに一種のtemplateを提供します。

2
Maroun

これは、Java設計上の決定です。継承と再利用の概念を使用します。これにより、すべてのクラスにwait()toString()など.

2
Aneesh

オブジェクトクラスは、Javaプログラミングの最もスーパークラスです。これには、タイプに応じて事前定義されたメソッドがあり、それらのメソッドを使用できます。&オブジェクトクラスを拡張する必要はありません&暗黙的にそこにあります

2
Yasa