public class Object
Objectクラスは、クラス階層のルートです。すべてのクラスは、スーパー・クラスとしてObjectを持ちます。配列を含むすべてのオブジェクトは、このクラスのメソッドを実装します。Class| コンストラクタと説明 |
|---|
Object() |
| 修飾子と型 | メソッドと説明 |
|---|---|
protected Object |
clone()
このオブジェクトのコピーを作成して、返します。
|
boolean |
equals(Object obj)
このオブジェクトと他のオブジェクトが等しいかどうかを示します。
|
protected void |
finalize()
このオブジェクトへの参照はもうないとガベージ・コレクションによって判断されたときに、ガベージ・コレクタによって呼び出されます。
|
Class<?> |
getClass()
この
Objectの実行時クラスを返します。 |
int |
hashCode()
オブジェクトのハッシュ・コード値を返します。
|
void |
notify()
このオブジェクトのモニターで待機中のスレッドを1つ再開します。
|
void |
notifyAll()
このオブジェクトのモニターで待機中のすべてのスレッドを再開します。
|
String |
toString()
オブジェクトの文字列表現を返します。
|
void |
wait()
別のスレッドがこのオブジェクトの
notify()メソッドまたはnotifyAll()メソッドを呼び出すまで、現在のスレッドを待機させます。 |
void |
wait(long timeout)
別のスレッドがこのオブジェクトの
notify()メソッドまたはnotifyAll()メソッドを呼び出すか、指定された時間が経過するまで、現在のスレッドを待機させます。 |
void |
wait(long timeout, int nanos)
別のスレッドがこのオブジェクトの
notify()メソッドまたはnotifyAll()メソッドを呼び出すか、ほかのスレッドが現在のスレッドに割込みをかけたり、指定された量の実時間が経過するまで、現在のスレッドを待機させます。 |
public final Class<?> getClass()
Objectの実行時クラスを返します。返されるClassオブジェクトは、表されたクラスのstatic synchronizedメソッドによってロックされるオブジェクトです。
実際の結果型はClass<? extends |X|>です。ここで、|X|はgetClassが呼び出される式のstatic型の消去です。たとえば、このコードの抜粋ではキャストは必要ありません。
Number n = 0;
Class<? extends Number> c = n.getClass();
Classオブジェクト。public int hashCode()
HashMapによって提供されるハッシュ表などの、ハッシュ表の利点のためにサポートされています。
hashCodeの一般的な規則は次のとおりです。
equalsの比較で使用される情報が変更されていなければ、hashCodeメソッドは常に同じ整数を返す必要があります。ただし、この整数は同じアプリケーションの実行ごとに同じである必要はありません。
equals(Object)メソッドに従って2つのオブジェクトが等しい場合は、2つの各オブジェクトに対するhashCodeメソッドの呼出しによって同じ整数の結果が生成される必要があります。
equals(java.lang.Object)メソッドに従って2つのオブジェクトが等しくない場合は、2つの各オブジェクトに対するhashCodeメソッドの呼出しによって異なる整数の結果が生成される必要はありません。ただし、プログラマは、等しくないオブジェクトに対して異なる整数の結果を生成すると、ハッシュ表のパフォーマンスが向上する場合があることに気付くはずです。
クラスObjectによって定義されたhashCodeメソッドは、可能なかぎり、異なるオブジェクトに対して異なる整数を返します。(これは通常、オブジェクトの内部アドレスを整数に変換することによって実装されますが、この実装テクニックはJava™プログラミング言語では必要ありません。)
equals(java.lang.Object), System.identityHashCode(java.lang.Object)public boolean equals(Object obj)
equalsメソッドは、null以外のオブジェクト参照での同値関係を実装します。
xについて、x.equals(x)はtrueを返します。
xおよびyについて、y.equals(x)がtrueを返す場合に限り、x.equals(y)はtrueを返します。
x、y、およびzについて、x.equals(y)がtrueを返し、y.equals(z)がtrueを返す場合、x.equals(z)はtrueを返します。
xおよびyについて、x.equals(y)の複数の呼出しは、このオブジェクトに対するequalsによる比較で使われた情報が変更されていなければ、一貫してtrueを返すか、一貫してfalseを返します。
xについて、x.equals(null)はfalseを返します。
Objectクラスのequalsメソッドは、もっとも比較しやすいオブジェクトの同値関係を実装します。つまり、null以外の参照値xとyについて、このメソッドはxとyが同じオブジェクトを参照する(x == yがtrue)場合にだけtrueを返します。
通常、このメソッドをオーバーライドする場合は、hashCodeメソッドを常にオーバーライドして、「等価なオブジェクトは等価なハッシュ・コードを保持する必要がある」というhashCodeメソッドの汎用規約に従う必要があることに留意してください。
obj - 比較対象の参照オブジェクト。true、それ以外の場合はfalse。hashCode()、HashMapprotected Object clone() throws CloneNotSupportedException
xについて、次の式
がtrueであり、次の式x.clone() != x
がx.clone().getClass() == x.getClass()
trueになることですが、これらは絶対的な要件ではありません。また次の式
がx.clone().equals(x)
trueになりますが、これは絶対的な要件ではありません。
慣例上、返されたオブジェクトは、super.cloneを呼び出すことによって取得するようにしてください。クラスとそのすべてのスーパー・クラス(Objectを除く)がこの規則に従っている場合は、x.clone().getClass()== x.getClass()が成立します。
通常、このメソッドにより返されるオブジェクトは、このオブジェクト(複製されている)から独立している必要があります。この独立性を実現するには、super.cloneによって返されたオブジェクトを返す前に、その1つ以上のフィールドを変更することが必要になる場合があります。これは、通常、複製するオブジェクトの内部「深層構造」を構成する可変オブジェクトのコピー、およびこれらのオブジェクトへの参照をコピーへの参照に置き換えることを意味します。クラスにプリミティブ・フィールドまたは不変オブジェクトへの参照しか含まれていない場合は、通常、super.cloneによって返されたオブジェクト内のフィールドを変更する必要がありません。
クラスObjectのメソッドcloneは、特定のクローニング操作を実行します。まず、このオブジェクトのクラスがインタフェースCloneableを実装していない場合は、CloneNotSupportedExceptionがスローされます。すべての配列がインタフェースCloneableを実装していると見なされること、および配列型T[]のcloneメソッドの戻り値の型はT[] (ここで、Tは任意の参照またはプリミティブ型)です。実装していない場合、このメソッドはこのオブジェクトのクラスの新しいインスタンスを生成し、そのフィールドをすべて、このオブジェクトの対応する各フィールドの内容で初期化します。これは代入と同様で、フィールドの内容自身が複製されるのではありません。つまりこのメソッドは、オブジェクトの「シャロー・コピー」を生成しますが、「ディープ・コピー」は生成しません。
クラスObject自体はインタフェースCloneableを実装していないため、クラスがObjectであるオブジェクトに対してcloneメソッドを呼び出すと、実行時に例外がスローされます。
CloneNotSupportedException - オブジェクトのクラスがCloneableインタフェースをサポートしていない場合。cloneメソッドをオーバーライドしたサブクラスも、インスタンスを複製できないことを示すためにこの例外をスローすることがある。Cloneablepublic String toString()
toStringメソッドは、このオブジェクトを「テキストで表す」文字列を返します。この結果は、人間が読める簡潔で有益な情報であるべきです。すべてのサブクラスで、このメソッドをオーバーライドすることをお薦めします。
クラスObjectのtoStringメソッドは、オブジェクトがインスタンスになっている元のクラスの名前、アットマーク文字「@」、およびオブジェクトのハッシュ・コードの符号なし16進数表現から構成される文字列を返します。つまり、このメソッドは次の値と等しい文字列を返します。
getClass().getName() + '@' + Integer.toHexString(hashCode())
public final void notify()
waitメソッドを呼び出すと、オブジェクトのモニターで待機します。
再開されたスレッドの処理は、現在のスレッドがこのオブジェクトのロックを解除するまでは進むことができません。再開されたスレッドは、ほかのスレッドと同じように、このオブジェクトと同期するように積極的に競います。たとえば、このオブジェクトをロックする次のスレッドになろうとする場合でも、再開されたスレッドの扱いはほかのスレッドより優勢でも劣勢でもありません。
このメソッドを呼び出すのは、このオブジェクトのモニターを所有するスレッドだけでなければいけません。スレッドがオブジェクトのモニターのオーナーになる方法は、次の3通りがあります。
synchronized文の本体を実行する。
Class,型のオブジェクトの場合は、そのクラスのsyncronized staticメソッドを実行する。
オブジェクトのモニターを所有できるスレッドは1回に1つだけです。
IllegalMonitorStateException - 現在のスレッドがこのオブジェクトのモニターを所有していない場合。notifyAll(), wait()public final void notifyAll()
waitメソッドを呼び出すと、オブジェクトのモニターで待機します。
再開されたスレッドの処理は、現在のスレッドがこのオブジェクトのロックを解除するまでは進むことができません。再開されたスレッドは、ほかのスレッドと同じように、このオブジェクトと同期するように積極的に競います。たとえば、このオブジェクトをロックする次のスレッドになろうとする場合でも、再開されたスレッドの扱いはほかのスレッドより優勢でも劣勢でもありません。
このメソッドを呼び出すのは、このオブジェクトのモニターを所有するスレッドだけでなければいけません。スレッドがオブジェクトのモニターのオーナーになる方法については、notifyメソッドを参照してください。
IllegalMonitorStateException - 現在のスレッドがこのオブジェクトのモニターを所有していない場合。notify(), wait()public final void wait(long timeout)
throws InterruptedException
notify()メソッドまたはnotifyAll()メソッドを呼び出すか、指定された時間が経過するまで、現在のスレッドを待機させます。
現在のスレッドは、このオブジェクトのモニターのオーナーでなければなりません。
このメソッドは、現在のスレッド(ここではTとする)をこのオブジェクトの待機セットに入れてから、このオブジェクトについての同期要求をすべて廃棄します。スレッドTは、スレッドのスケジューリングについては無効とされ、次の4つのどれかが発生するまで待機します。
notifyメソッドを呼び出し、再開されるスレッドとしてスレッドTが選ばれた。
notifyAllメソッドを呼び出した。
timeoutがゼロの場合、実時間が考慮されることはなく、スレッドは通知を受けるまで待機し続ける。
waitメソッドが呼び出されたときの状態に復元されます。次にスレッドTはwaitメソッドの呼び出しから復帰します。こうして、waitメソッドから復帰した時点で、オブジェクトおよびスレッドTの同期ステータスは、waitメソッドが呼び出されたときとまったく同じになります。
スレッドは、通知、割り込み、タイム・アウトなしに再開されることがあります。これは、スプリアス・ウェイクアップと呼ばれています。スプリアス・ウェイクアップは、実際にはまれにしか発生しませんが、アプリケーションでは、スレッドが再開されることで発生する可能性がある条件をテストし、条件が満たされない場合は待機を続けて、スプリアス・ウェイクアップから保護しなければいけません。つまり、次のようにループで常に待機が発生するようにする必要があります。
synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout);
... // Perform action appropriate to condition
}
(このトピックの詳細は、Doug Lea著『Concurrent Programming in Java (Second Edition)』(Addison-Wesley, 2000)のセクション3.2.3やJoshua Bloch著『Effective Java Programming Language Guide』(Addison-Wesley, 2001)のアイテム50を参照してください)。
現在のスレッドの待機中または待機前に任意のスレッドから割り込みがかかった場合、InterruptedExceptionがスローされます。この例外は、このオブジェクトのロック・ステータスが前述のように復元されるまではスローされません。
現在のスレッドをこのオブジェクトの待機セットに入れるときに、waitメソッドはこのオブジェクトのロックだけを解除します。現在のスレッドが同期をとる可能性のあるその他のオブジェクトは、このスレッドが待機している間もロックされたままです。
このメソッドを呼び出すのは、このオブジェクトのモニターを所有するスレッドだけでなければいけません。スレッドがオブジェクトのモニターのオーナーになる方法については、notifyメソッドを参照してください。
timeout - ミリ秒単位の最大待機時間。IllegalArgumentException - timeoutの値が負である場合。IllegalMonitorStateException - 現在のスレッドがオブジェクトのモニターを所有していない場合。InterruptedException - 現在のスレッドが通知を待機する前または待機中に、いずれかのスレッドが現在のスレッドに割り込んだ場合。この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。notify(), notifyAll()public final void wait(long timeout,
int nanos)
throws InterruptedException
notify()メソッドまたはnotifyAll()メソッドを呼び出すか、ほかのスレッドが現在のスレッドに割込みをかけたり、指定された量の実時間が経過するまで、現在のスレッドを待機させます。
このメソッドは、引数が1つのwaitメソッドに似ていますが、タイム・アウトまでの待ち時間の量をより細かく制御できます。ナノ秒単位の実時間は、次の式で指定します。
1000000*timeout+nanos
その他の面では、このメソッドの動作は引数が1つのwait(long)メソッドと同じです。特に、wait(0, 0)はwait(0)と同じ意味になります。
現在のスレッドは、このオブジェクトのモニターのオーナーでなければなりません。スレッドはこのモニターの所有権を解放し、次のどれかの状態が発生するまで待機します。
notifyメソッドまたはnotifyAllメソッドを呼び出すことによって、このオブジェクトのモニターで待機中のスレッドに通知を出し、このスレッドを再開する。
timeout引数に指定したタイム・アウト期間(ミリ秒単位)と、nanos引数に指定したタイム・アウト期間(ナノ秒単位)を足した時間が経過する。
そのあと、スレッドはモニターの所有権を再度取得するまで待機してから実行を再開します。
引数が1つのバージョンでは、割り込みやスプリアス・ウェイクアップが発生する可能性があるので、このメソッドは常にループで使用される必要があります。
synchronized (obj) {
while (<condition does not hold>)
obj.wait(timeout, nanos);
... // Perform action appropriate to condition
}
このメソッドを呼び出すのは、このオブジェクトのモニターを所有するスレッドだけでなければいけません。スレッドがオブジェクトのモニターのオーナーになる方法については、notifyメソッドを参照してください。timeout - ミリ秒単位の最大待機時間。nanos - 追加の待ち時間(ナノ秒単位で0から999999の範囲)。IllegalArgumentException - 待ち時間の値が負の場合、またはnanosの値が0から999999の範囲外の場合。IllegalMonitorStateException - 現在のスレッドがこのオブジェクトのモニターを所有していない場合。InterruptedException - 現在のスレッドが通知を待機する前または待機中に、いずれかのスレッドが現在のスレッドに割り込んだ場合。この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。public final void wait()
throws InterruptedException
notify()メソッドまたはnotifyAll()メソッドを呼び出すまで、現在のスレッドを待機させます。つまり、このメソッドの動作はwait(0)を呼び出した場合と同じです。
現在のスレッドは、このオブジェクトのモニターのオーナーでなければなりません。スレッドはこのモニターの所有権を解放し、別のスレッドがnotifyメソッドまたはnotifyAllメソッドを呼び出してこのオブジェクトのモニター上で待機するスレッドに通知を出すまで待機します。そのあと、スレッドはモニターの所有権を再度取得するまで待機してから実行を再開します。
引数が1つのバージョンでは、割り込みやスプリアス・ウェイクアップが発生する可能性があるので、このメソッドは常にループで使用される必要があります。
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
このメソッドを呼び出すのは、このオブジェクトのモニターを所有するスレッドだけでなければいけません。スレッドがオブジェクトのモニターのオーナーになる方法については、notifyメソッドを参照してください。IllegalMonitorStateException - 現在のスレッドがオブジェクトのモニターを所有していない場合。InterruptedException - 現在のスレッドが通知を待機する前または待機中に、いずれかのスレッドが現在のスレッドに割り込んだ場合。この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。notify(), notifyAll()protected void finalize()
throws Throwable
finalizeメソッドをオーバーライドして、システム・リソースを破棄したり、その他のクリーンアップを行ったりすることができます。
finalizeの一般的な規約では、その呼出しは、まだ生存している任意のスレッドがこのオブジェクトにアクセスできる方法はもうないと、Java™仮想マシンが判断した場合に行われます。ただし、ファイナライズの準備が済んだ他のオブジェクトまたはクラスをファイナライズするためのアクションの結果そうなった場合を除きます。finalizeメソッドは、このオブジェクトを別のスレッドでふたたび利用可能にすることも含めて、任意のアクションを行うことができます。しかし、finalizeの通常の用途は、オブジェクトを再生不可能な形で破棄する前のクリーンアップを実行することです。たとえば、入出力の接続を表すオブジェクトのfinalizeメソッドは、オブジェクトが永久的に破棄される前に、接続を切断するための明示的な入出力処理を行います。
Objectクラスのfinalizeメソッドは、特別な処理を行いません。通常は、何もしないで復帰します。Objectのサブクラスは、この定義をオーバーライドすることができます。
Javaプログラミング言語は、任意のオブジェクトについてどのスレッドがfinalizeメソッドを呼び出すかを保証しません。しかし、finalizeを呼び出すスレッドが、ユーザーに可視な同期ロックをfinalize呼出しの時点では保持していないことについては保証されます。キャッチされない例外をfinalizeメソッドがスローした場合、例外は無視され、オブジェクトのファイナライズは終了します。
あるオブジェクトについてfinalizeメソッドが呼び出されたあとに次の処理が発生するのは、まだ生存している任意のスレッドがこのオブジェクトにアクセスできる方法はないと、Java Virtual Machineがふたたび判断したときです。これには、ファイナライズの準備ができているほかのオブジェクトまたはクラスによって発生した処理も含まれ、その時点でこのオブジェクトは破棄されます。
任意のオブジェクトについてJava Virtual Machineがfinalizeメソッドを複数回呼び出すことはありません。
finalizeメソッドによって例外がスローされると、finalizeメソッドの処理は停止されます。そうでない場合は無視されます。
Throwable - このメソッドで生じたExceptionWeakReference, PhantomReference バグまたは機能を送信
詳細なAPIリファレンスおよび開発者ドキュメントについては、Java SEのドキュメントを参照してください。そのドキュメントには、概念的な概要、用語の定義、回避方法、有効なコード例などの、開発者を対象にしたより詳細な説明が含まれています。
Copyright© 1993, 2014, Oracle and/or its affiliates. All rights reserved.