すべてのクラスで JVM が暗黙的に拡張されると聞きましたが、それを拡張する必要はありますか? Object クラスを拡張しないと、カスタム クラスのオブジェクトを作成できません。オブジェクトが作成されているときに、すべてのカスタムクラスで何が起こるかを明確に説明してください。
6 に答える
Object
クラスにはすべての共通メソッドが含まれています。そのため、デフォルトで暗黙的な exetending を使用すると、オーバーヘッドを削減する共通のメソッドが提供されます。
メソッドは -equals, wait, notify, notifyall, hashcode,getClass,clone etc
カスタム ロジックが必要な場合は、それが可能override
ですmethod
。
注: 配列を含むすべてのオブジェクトは、Object クラスのメソッドを実装します。
デフォルトでこの機能を提供するために、すべてのクラスはクラスを拡張しますObject
。
equals
オブジェクト参照が同じオブジェクトを参照しているかどうかをチェックするオブジェクトクラスのメソッドを検討してください。メソッドの実装を提供しない場合equals()
、デフォルトのメソッドがカスタム オブジェクトに対しても呼び出されます。- デフォルトの
toString
メソッドは、オブジェクトのクラス名とハッシュコードを提供します。オブジェクトの他の文字列表現が必要ない場合は、別のものを記述する必要はありません。 - のようなメソッドは
wait(), notify(), notifyAll()
、オブジェクトのスレッド通信の機能を提供します。したがって、クラスは外部で行う必要はありません。Object
クラスの機能を拡張するだけです。
これに対する答えは、一般的な継承の考え方に関連しています。継承の考え方は、すべてのサブクラスに適用される共通の一連の動作を定義することです。「Object」クラスで定義されたものはすべて、作成するすべてのクラスで使用できます。
これには、コードで使用するすべての情報に適用できるいくつかの事項が含まれています。
equals and hashCode
与えられた抽象化内で平等理論を確立する方法。toString
人間が読める形式 (おそらくプログラマーのみが読める形式) でオブジェクトを表現します。getClass
特定の抽象化にリフレクション機能を提供する。オブジェクト指向ランタイムを編成するためのいくつかの方法。
Java は、単一のクラスをすべての最終的な親クラスにすることを選択したため、任意のオブジェクトをその型を知らなくても簡単に渡すことができます (つまり、Object の宣言された型を使用して、すべての単一項目を参照できます)。型システムでは、ラッパー クラスを使用するプリミティブも含まれます)。ただし、C++ などの OOP 言語では、Java のようなユニバーサル基本クラスがありません。ユニバーサル基本クラスを持つことのもう 1 つの利点は、スーパークラスを処理するロジックを最上位クラスの特別なケースにする必要がないことです (ただし、ユニバーサル基本クラス Object 自体は例外です)。
Object
クラスは階層へのルートを提供します。つまり、オブジェクトを渡すことができ、期待することができます。
クラスが何らかの方法でオブジェクトを拡張しない場合、引数として期待したり、パラメーターとして渡したりすることはできません。無駄だ。
それとは別に、Object クラスは、Java の多くの重要な操作を定義する非常に重要なメソッドを保持しています。
クラスを作成しているときは、そのクラスのインスタンスを作成したいと思うでしょう。これらのインスタンスには、いくつかの特定のプロパティといくつかの基本的なプロパティが必要です。
これらの基本的なプロパティは、Object
クラスですぐに使用できます。そのため、Object クラスを暗黙的に拡張します。
カスタム クラスの特定のプロパティは、カスタム クラスで定義されます。
したがって、カスタム クラスのインスタンス (オブジェクト) を作成する場合は、次のようになります。
1. Object class properties are inherited by your custom class.
2. Your custom class specific properties are alloted to your instance. Hence, now your instance would have custom + Object properties.