JavaTM Platform
Standard Ed. 6

java.lang
クラス Object

java.lang.Object

public class Object

Object クラスは、クラス階層のルートです。すべてのクラスは、スーパークラスとして Object を持ちます。配列を含むすべてのオブジェクトは、このクラスのメソッドを実装します。

導入されたバージョン:
JDK1.0
関連項目:
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() メソッドを呼び出すか、ほかのスレッドが現在のスレッドに割り込みをかけたり、指定された量の実時間が経過するまで、現在のスレッドを待機させます。
 

コンストラクタの詳細

Object

public Object()
メソッドの詳細

getClass

public final Class<?> getClass()
この Object の実行時クラスを返します。返される Class オブジェクトは、表されたクラスの static synchronized メソッドによってロックされるオブジェクトです。

実際の結果型は Class<? extends |X|> です。ここで、|X|getClass が呼び出される static 型のイレイジャーです。たとえば、このコードの抜粋ではキャストは必要ありません。

Number n = 0;
Class<? extends Number> c = n.getClass();

戻り値:
このオブジェクトの実行時クラスを表す Class オブジェクト
関連項目:
『Java 言語仕様、第 3 版』 (15.8.2 Class Literals)

hashCode

public int hashCode()
オブジェクトのハッシュコード値を返します。このメソッドは、java.util.Hashtable によって提供されるようなハッシュテーブルで使用するために用意されています。  

hashCode メソッドの一般的な規則を次に示します。

できるかぎり、Object クラスで定義される hashCode メソッドは、異なるオブジェクトについては異なる整数値を返します。通常、これはオブジェクトの内部アドレスを整数値に変換する形で実装されますが、そのような実装テクニックは JavaTM プログラミング言語では不要です。

戻り値:
このオブジェクトのハッシュコード値
関連項目:
equals(java.lang.Object), Hashtable

equals

public boolean equals(Object obj)
このオブジェクトと「等価」になるオブジェクトがあるかどうかを示します。  

equals メソッドは、null 以外のオブジェクト参照での同値関係を実装します。

Object クラスの equals メソッドは、もっとも比較しやすいオブジェクトの同値関係を実装します。 つまり、null 以外の参照値 xy について、このメソッドは xy が同じオブジェクトを参照する (x == ytrue) 場合にだけ true を返します。  

通常、このメソッドをオーバーライドする場合は、hashCode メソッドを常にオーバーライドして、「等価なオブジェクトは等価なハッシュコードを保持する必要がある」という hashCode メソッドの汎用規約に従う必要があることに留意してください。

パラメータ:
obj - 比較対象の参照オブジェクト
戻り値:
obj 引数に指定されたオブジェクトとこのオブジェクトが等しい場合は true、そうでない場合は false
関連項目:
hashCode(), Hashtable

clone

protected Object clone()
                throws CloneNotSupportedException
このオブジェクトのコピーを作成して、返します。「コピー」の正確な意味合いは、オブジェクトのクラスによって異なります。一般的には、任意のオブジェクト x について、次の式
 x.clone() != x
が true であり、次の式
 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 を実装しているものと見なされることに注意してください。実装していない場合、このメソッドはこのオブジェクトのクラスの新しいインスタンスを生成し、そのフィールドをすべて、このオブジェクトの対応する各フィールドの内容で初期化します。 これは代入と同様で、フィールドの内容自身が複製されるのではありません。つまりこのメソッドは、オブジェクトの「シャローコピー」を生成しますが、「ディープコピー」は生成しません。  

Object クラス自体は、Cloneable インタフェースを実装しないため、クラスが Object である clone メソッドを呼び出すと、実行時に例外がスローされます。

戻り値:
このインスタンスの複製
例外:
CloneNotSupportedException - オブジェクトのクラスが Cloneable インタフェースをサポートしていない場合。clone メソッドをオーバーライドしたサブクラスも、インスタンスを複製できないことを示すためにこの例外をスローすることがある
関連項目:
Cloneable

toString

public String toString()
オブジェクトの文字列表現を返します。通常、toString メソッドはこのオブジェクトを「テキストで表現する」文字列を返します。この結果は、人間が読める簡潔で有益な情報であるべきです。すべてのサブクラスで、このメソッドをオーバーライドすることをお勧めします。  

Object クラスの toString メソッドは、オブジェクトの派生元のクラス名、アットマーク (@)、およびオブジェクトのハッシュコードの符号なし 16 進表現から構成される文字列を返します。つまり、このメソッドは次の値と等しい文字列を返します。

 getClass().getName() + '@' + Integer.toHexString(hashCode())
 

戻り値:
このオブジェクトの文字列表現

notify

public final void notify()
このオブジェクトのモニターで待機中のスレッドを 1 つ再開します。このオブジェクトで複数のスレッドが待機中の場合は、そのうちの 1 つを再開します。この選択は任意で、実装によって異なります。スレッドは、wait メソッドを呼び出すと、オブジェクトのモニターで待機します。  

再開されたスレッドの処理は、現在のスレッドがこのオブジェクトのロックを解除するまでは進むことができません。再開されたスレッドは、ほかのスレッドと同じように、このオブジェクトと同期するように積極的に競います。 たとえば、このオブジェクトをロックする次のスレッドになろうとする場合でも、再開されたスレッドの扱いはほかのスレッドより優勢でも劣勢でもありません。  

このメソッドを呼び出すのは、このオブジェクトのモニターを所有するスレッドだけでなければなりません。スレッドがオブジェクトのモニターのオーナになる方法は、次の 3 通りがあります。

オブジェクトのモニターを所有できるスレッドは 1 回に 1 つだけです。

例外:
IllegalMonitorStateException - 現在のスレッドがこのオブジェクトのモニターを所有していない場合
関連項目:
notifyAll(), wait()

notifyAll

public final void notifyAll()
このオブジェクトのモニターで待機中のすべてのスレッドを再開します。スレッドは、wait メソッドを呼び出すと、オブジェクトのモニターで待機します。  

再開されたスレッドの処理は、現在のスレッドがこのオブジェクトのロックを解除するまでは進むことができません。再開されたスレッドは、ほかのスレッドと同じように、このオブジェクトと同期するように積極的に競います。 たとえば、このオブジェクトをロックする次のスレッドになろうとする場合でも、再開されたスレッドの扱いはほかのスレッドより優勢でも劣勢でもありません。  

このメソッドを呼び出すのは、このオブジェクトのモニターを所有するスレッドだけでなければなりません。スレッドがオブジェクトのモニターのオーナになる方法については、notify メソッドを参照してください。

例外:
IllegalMonitorStateException - 現在のスレッドがこのオブジェクトのモニターを所有していない場合
関連項目:
notify(), wait()

wait

public final void wait(long timeout)
                throws InterruptedException
別のスレッドがこのオブジェクトの notify() メソッドまたは notifyAll() メソッドを呼び出すか、指定された時間が経過するまで、現在のスレッドを待機させます。  

現在のスレッドは、このオブジェクトのモニターのオーナでなければなりません。  

このメソッドは、現在のスレッド (ここでは T とする) をこのオブジェクトの待機セットに入れてから、このオブジェクトについての同期要求をすべて廃棄します。スレッド T は、スレッドのスケジューリングについては無効とされ、以下の 4 つのどれかが発生するまで待機します。

その後スレッド T はこのオブジェクトの待機セットから削除され、スレッドのスケジューリングが再び可能になります。以後、このスレッドは通常どおりに、オブジェクトと同期化する権利をほかのスレッドと競います。 オブジェクトの制御を獲得すれば、オブジェクトに対するこのスレッドの同期要求は、以前の状態、つまり、wait メソッドが呼び出されたときの状態に復元されます。次にスレッド Twait メソッドの呼び出しから復帰します。こうして、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()

wait

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) と同じ意味になります。  

現在のスレッドは、このオブジェクトのモニターのオーナでなければなりません。スレッドはこのモニターの所有権を解放し、次のどれかの状態が発生するまで待機します。

そのあと、スレッドはモニターの所有権を再度取得するまで待機してから実行を再開します。  

引数が 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 - 現在のスレッドが通知を待機する前または待機中に、いずれかのスレッドが現在のスレッドに割り込んだ場合。この例外がスローされると、現在のスレッドの「割り込みステータス」はクリアされる

wait

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()

finalize

protected void finalize()
                 throws Throwable
このオブジェクトへの参照はもうないとガベージコレクションによって判断されたときに、ガベージコレクタによって呼び出されます。サブクラスは finalize メソッドをオーバーライドして、システムリソースを破棄したり、その他のクリーンアップを行ったりすることができます。  

finalize の一般的な規約では、finalize の呼び出しは、まだ生存している任意のスレッドがこのオブジェクトにアクセスする方法はないと、JavaTM 仮想マシンが判断した場合に行われます。 ただし、ファイナライズの準備が済んだほかのオブジェクトまたはクラスをファイナライズするための処理の結果そうなった場合を除きます。finalize メソッドは、このオブジェクトを別のスレッドで再び利用可能にすることも含めて、任意のアクションを行うことができます。 しかし、finalize の通常の用途は、オブジェクトを再生不可能な形で破棄する前のクリーンアップを実行することです。たとえば、入出力の接続を表すオブジェクトの finalize メソッドは、オブジェクトが永久的に破棄される前に、接続を切断するための明示的な入出力処理を行います。  

Object クラスの finalize メソッドは、特別な処理を行いません。 通常は、何もしないで復帰します。Object のサブクラスは、この定義をオーバーライドすることができます。  

Java プログラミング言語は、任意のオブジェクトについてどのスレッドが finalize メソッドを呼び出すかを保証しません。しかし、finalize を呼び出すスレッドが、ユーザーに可視な同期ロックを finalize 呼び出しの時点では保持していないことについては保証されます。キャッチされない例外を finalize メソッドがスローした場合、例外は無視され、オブジェクトのファイナライズは終了します。  

あるオブジェクトについて finalize メソッドが呼び出されたあとに次の処理が発生するのは、まだ生存している任意のスレッドがこのオブジェクトにアクセスできる方法はないと、Java 仮想マシンが再び判断したときです。これには、ファイナライズの準備ができているほかのオブジェクトまたはクラスによって発生した処理も含まれ、その時点でこのオブジェクトは破棄されます。  

任意のオブジェクトについて Java 仮想マシンが finalize メソッドを複数回呼び出すことはありません。  

finalize メソッドによって例外がスローされると、finalize メソッドの処理は停止されます。そうでない場合は無視されます。

例外:
Throwable - このメソッドで生じた Exception

JavaTM Platform
Standard Ed. 6

バグの報告と機能のリクエスト
さらに詳しい API リファレンスおよび開発者ドキュメントについては、Java SE 開発者用ドキュメントを参照してください。開発者向けの詳細な解説、概念の概要、用語の定義、バグの回避策、およびコード実例が含まれています。

Copyright 2006 Sun Microsystems, Inc. All rights reserved. Use is subject to license terms. Documentation Redistribution Policy も参照してください。