|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
java.lang.Object
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 Object()
メソッドの詳細 |
---|
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()
java.util.Hashtable
によって提供されるようなハッシュテーブルで使用するために用意されています。
hashCode
メソッドの一般的な規則を次に示します。
hashCode
メソッドを呼び出しても結果は同じ整数値にならなければならない
equals(java.lang.Object)
メソッドで 2 つのオブジェクトが等価でないとされた場合は、これらのオブジェクトに対して hashCode メソッドを呼び出したときに、結果が異なる整数値にならなくてもかまわない。しかし、等しくないオブジェクトについては異なる整数値が生成されるようにすれば、ハッシュテーブルのパフォーマンスを上げることができる
できるかぎり、Object クラスで定義される hashCode メソッドは、異なるオブジェクトについては異なる整数値を返します。通常、これはオブジェクトの内部アドレスを整数値に変換する形で実装されますが、そのような実装テクニックは JavaTM プログラミング言語では不要です。
equals(java.lang.Object)
,
Hashtable
public boolean equals(Object obj)
equals
メソッドは、null 以外のオブジェクト参照での同値関係を実装します。
x
について、x.equals(x)
は true
を返す
x
と y
について、x.equals(y)
は、y.equals(x)
が true
を返す場合だけ true
を返す
x
、y
、z
について、x.equals(y)
が true
を返し、かつ y.equals(z)
が true
を返す場合に、x.equals(z)
は true
を返す
x
および y
について、x.equals(y) を複数呼び出すと常に true
を返すか、常に false
を返す。 これは、オブジェクトに対する equals
による比較で使われた情報が変更されていないことが条件である
x
について、x.equals(null)
は false
を返す
Object
クラスの equals メソッドは、もっとも比較しやすいオブジェクトの同値関係を実装します。 つまり、null 以外の参照値 x
と y
について、このメソッドは x
と y
が同じオブジェクトを参照する (x == y
が true
) 場合にだけ true
を返します。
通常、このメソッドをオーバーライドする場合は、hashCode メソッドを常にオーバーライドして、「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という hashCode メソッドの汎用規約に従う必要があることに留意してください。
obj
- 比較対象の参照オブジェクト
true
、そうでない場合は false
hashCode()
,
Hashtable
protected Object clone() throws CloneNotSupportedException
が true であり、次の式x.clone() != x
も true であることですが、これらも絶対的な要件ではありません。また次の式x.clone().getClass() == x.getClass()
も通常 true になりますが、これも絶対的な要件ではありません。x.clone().equals(x)
通常、super.clone を呼び出すことで返されるオブジェクトを取得できます。クラスおよびそのスーパークラスすべて (Object を除く) がこの規則に従う場合、x.clone().getClass() == x.getClass() が成立します。
通常、このメソッドにより返されるオブジェクトは、このオブジェクト (複製されている) から独立している必要があります。この独立性を達成するため、super.clone が返すオブジェクトのフィールドを 1 つ以上 (オブジェクトが返す前に) 変更することが必要になる場合があります。これは、通常、複製するオブジェクトの内部「深層構造」を構成する可変オブジェクトのコピー、およびこれらのオブジェクトへの参照をコピーへの参照に置き換えることを意味します。クラスにプリミティブフィールドまたは不変オブジェクトへの参照だけが含まれる場合、通常、super.clone により返されるオブジェクト内のフィールドを変更する必要はありません。
Object クラスの clone メソッドは、特定の複製処理を実行します。まず、このオブジェクトのクラスが Cloneable インタフェースを実装していない場合は、CloneNotSupportedException がスローされます。配列はすべて、インタフェース Cloneable を実装しているものと見なされることに注意してください。実装していない場合、このメソッドはこのオブジェクトのクラスの新しいインスタンスを生成し、そのフィールドをすべて、このオブジェクトの対応する各フィールドの内容で初期化します。 これは代入と同様で、フィールドの内容自身が複製されるのではありません。つまりこのメソッドは、オブジェクトの「シャローコピー」を生成しますが、「ディープコピー」は生成しません。
Object クラス自体は、Cloneable インタフェースを実装しないため、クラスが Object である clone メソッドを呼び出すと、実行時に例外がスローされます。
CloneNotSupportedException
- オブジェクトのクラスが Cloneable
インタフェースをサポートしていない場合。clone
メソッドをオーバーライドしたサブクラスも、インスタンスを複製できないことを示すためにこの例外をスローすることがあるCloneable
public 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 つのどれかが発生するまで待機します。
スレッドは、通知、割り込み、タイムアウトなしに再開されることがあります。 これは、「スプリアスウェイクアップ」と呼ばれています。スプリアスウェイクアップは、実際にはまれにしか発生しませんが、アプリケーションでは、スレッドが再開されることで発生する可能性がある条件をテストし、条件が満たされない場合は待機を続けて、スプリアスウェイクアップから保護しなければいけません。つまり、次のようにループで常に待機が発生するようにする必要があります。
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 の一般的な規約では、finalize の呼び出しは、まだ生存している任意のスレッドがこのオブジェクトにアクセスする方法はないと、JavaTM 仮想マシンが判断した場合に行われます。 ただし、ファイナライズの準備が済んだほかのオブジェクトまたはクラスをファイナライズするための処理の結果そうなった場合を除きます。finalize メソッドは、このオブジェクトを別のスレッドで再び利用可能にすることも含めて、任意のアクションを行うことができます。 しかし、finalize の通常の用途は、オブジェクトを再生不可能な形で破棄する前のクリーンアップを実行することです。たとえば、入出力の接続を表すオブジェクトの finalize メソッドは、オブジェクトが永久的に破棄される前に、接続を切断するための明示的な入出力処理を行います。
Object クラスの finalize メソッドは、特別な処理を行いません。 通常は、何もしないで復帰します。Object のサブクラスは、この定義をオーバーライドすることができます。
Java プログラミング言語は、任意のオブジェクトについてどのスレッドが finalize メソッドを呼び出すかを保証しません。しかし、finalize を呼び出すスレッドが、ユーザーに可視な同期ロックを finalize 呼び出しの時点では保持していないことについては保証されます。キャッチされない例外を finalize メソッドがスローした場合、例外は無視され、オブジェクトのファイナライズは終了します。
あるオブジェクトについて finalize メソッドが呼び出されたあとに次の処理が発生するのは、まだ生存している任意のスレッドがこのオブジェクトにアクセスできる方法はないと、Java Virtual Machine が再び判断したときです。これには、ファイナライズの準備ができている他のオブジェクトまたはクラスによって発生した処理も含まれ、その時点でこのオブジェクトは破棄されます。
任意のオブジェクトについて Java Virtual Machine が finalize メソッドを複数回呼び出すことはありません。
finalize メソッドによって例外がスローされると、finalize
メソッドの処理は停止されます。そうでない場合は無視されます。
Throwable
- このメソッドで生じた Exception
|
JavaTM Platform Standard Ed. 6 |
|||||||||
前のクラス 次のクラス | フレームあり フレームなし | |||||||||
概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド |
Copyright 2009 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。