私はかなり長い間Java=でプログラミングしていますが、Java.lang.Object
クラスが何であるかを友人に説明しようとしたとき、私は単純なもの以上を思い付くことができませんでした-ライナー:
Java内のすべてのオブジェクトが
Java.lang.Object
を暗黙的に拡張します
なぜそうすべきなのか、私にはよくわかりませんでした。
そこで、手掛かりが見つかることを期待して、 GrepCode のソースコードを調べました。 Java.lang.Object
とは何か、そして何ができるのかがわかったので、なぜこのように設計されたのかについて特定の理由があったかどうかを知りたいのです。
私の質問はまだ優勢です:なぜすべてのオブジェクトがJava.lang.Object
を拡張する必要があるのですか?
Javaのすべてのオブジェクトに共通のAPIを使用して、
wait
、notify
、notifyAll
finalize
hashCode
、equals
clone
そして、すべてのオブジェクト
getClass
toString
これが言語の設計方法です。すべてのオブジェクトは基本クラスObject
を継承します。つまり、すべてのオブジェクトについて、toString()
、equals()
、hashCode()
などの特定のメソッドが存在することが保証されます。
Object
の最も重要な使用法は、toString()
のような一般的なメソッドを提供することではなく、すべての参照型を保持する一般的なtypeを提供することです。
C++にはObject
に相当するものがなく、人々はまだ満足しています。しかし、JavaにはポインタとC++のようなテンプレートがないため、Object
sなどの実装を可能にするためにはCollection
が必要です。
参照型とプリミティブ型に関する説明も参照してください。
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
を作成しました。
これは、toString()などの基本的な関数のほとんどが自動的に継承されるためです。次の質問はこれです。 ない 多重継承です マルチレベル 継承... 多重継承 単一クラスは2つ以上の基本クラスから派生していますが、マルチレベルでは、それ自体がオブジェクトクラスから派生した基本クラスを持っています
すべてのクラスは暗黙的にObjectクラスを拡張し、Java推奨事項に従ってすべてのクラスが持つべき基本機能を提供します。clone()、equals()、hashCode()、toString()など) 。
暗黙的には、クラスを拡張していない場合、コンパイラのみが暗黙的にオブジェクトクラスを拡張することを意味しますが、クラスがすでに他のクラスを拡張している場合、コンパイラはオブジェクトクラスを拡張しません。たとえばクラスA {}
クラスBはA {}を拡張します
ここでコンパイラは、クラスA宣言に暗黙的に拡張オブジェクトクラスを追加します。
クラスA オブジェクトを拡張 {}
クラスBはA {}を拡張します
クラスAはObjectクラスを拡張するため、equals()、toString()などのObjectクラスの基本機能を提供します。また、クラスBはクラスオブジェクトを暗黙的に拡張するクラスAを拡張するため、クラスBもこれらの機能をすべて提供します。
したがって、このアプローチに従うことにより、すべてのクラスオブジェクト(変数)は、すべてのJavaオブジェクトが持つべき機能に準拠し、多重継承(複数のクラスを拡張するクラス))Javaは許可されていません。このアプローチはマルチレベルの継承に従います。
最初に引用ヘッドJava第2版:
Javaのすべてに共通のスーパークラスがなければ、Javaの開発者がカスタムタイプを取ることができるメソッドを含むクラスを作成する方法はありません...彼らがいつ知っていたのかわからないタイプArrayListクラスを作成しました。
これは基本的に、Javaの一般的な定義済みクラス型の必要性を説明します。これは、言語によって提供されるさまざまな機能を実装するために使用できます。
docs を参照してください:
Java.langパッケージのObjectクラスは、クラス階層ツリーの最上位にあります。すべてのクラスは、Objectクラスの直接または間接の子孫です。使用または作成するすべてのクラスは、Objectのインスタンスメソッドを継承します。これらのメソッドを使用する必要はありませんが、使用する場合は、クラスに固有のコードでオーバーライドする必要がある場合があります。
Object
クラスは、allオブジェクトが持っている必要がある基本的な状態を定義するだけです-他のオブジェクトと比較するように。
すべてのparentクラスです。それは単にすべての派生オブジェクトに一種のtemplateを提供します。
これは、Java設計上の決定です。継承と再利用の概念を使用します。これにより、すべてのクラスにwait()
、toString()
など.
オブジェクトクラスは、Javaプログラミングの最もスーパークラスです。これには、タイプに応じて事前定義されたメソッドがあり、それらのメソッドを使用できます。&オブジェクトクラスを拡張する必要はありません&暗黙的にそこにあります