- java.lang.Object
-
public class Object
Object
クラスは、クラス階層のルートです。 すべてのクラスは、スーパー・クラスとしてObject
を持ちます。 配列を含むすべてのオブジェクトは、このクラスのメソッドを実装します。- 導入されたバージョン:
- 1.0
- 関連項目:
クラス
-
-
コンストラクタのサマリー
コンストラクタ コンストラクタ 説明 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()
現在のスレッドを起動するまで待ちます。通常、notifiedまたはinterruptedです。void
wait(long timeoutMillis)
現在のスレッドは、通常、notifiedまたはinterruptedによって、または一定量のリアルタイムが経過するまで、起動するまで待機します。void
wait(long timeoutMillis, int nanos)
現在のスレッドは、通常、notifiedまたはinterruptedによって、または一定量のリアルタイムが経過するまで、起動するまで待機します。
-
-
-
メソッドの詳細
-
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™言語仕様:
- 15.8.2 クラス・リテラル
-
hashCode
public int hashCode()
オブジェクトのハッシュ・コード値を返します。 このメソッドは、HashMap
によって提供されるハッシュ表などの、ハッシュ表の利点のためにサポートされています。hashCode
の一般的な規則は次のとおりです。- Javaアプリケーションの実行中に同じオブジェクトに対して複数回呼び出された場合は常に、このオブジェクトに対する
equals
の比較で使用される情報が変更されていなければ、hashCode
メソッドは常に同じ整数を返す必要があります。 ただし、この整数は同じアプリケーションの実行ごとに同じである必要はありません。 equals(Object)
メソッドに従って2つのオブジェクトが等しい場合は、2つの各オブジェクトに対するhashCode
メソッドの呼出しによって同じ整数の結果が生成される必要があります。equals(java.lang.Object)
メソッドに従って2つのオブジェクトが等しくない場合は、2つの各オブジェクトに対するhashCode
メソッドの呼出しによって異なる整数の結果が生成される必要はありません。 ただし、プログラマは、等しくないオブジェクトに対して異なる整数の結果を生成すると、ハッシュ表のパフォーマンスが向上する可能性があることに注意するようにしてください。
- 実装要件:
- 厳密に実用的な方法として、クラス
Object
によって定義されたhashCode
メソッドは、個別のオブジェクトに対して個別の整数を返します。 - 戻り値:
- このオブジェクトのハッシュ・コード値。
- 関連項目:
equals(java.lang.Object)
,System.identityHashCode(java.lang.Object)
- Javaアプリケーションの実行中に同じオブジェクトに対して複数回呼び出された場合は常に、このオブジェクトに対する
-
equals
public boolean equals(Object obj)
このオブジェクトと他のオブジェクトが等しいかどうかを示します。equals
メソッドは、null以外のオブジェクト参照での同値関係を実装します。- 反射性(reflexive): null以外の参照値
x
について、x.equals(x)
はtrue
を返します。 - 対称性(symmetric): null以外の参照値
x
およびy
について、y.equals(x)
がtrue
を返す場合に限り、x.equals(y)
はtrue
を返します。 - 推移性(transitive): null以外の参照値
x
、y
、およびz
について、x.equals(y)
がtrue
を返し、y.equals(z)
がtrue
を返す場合、x.equals(z)
はtrue
を返します。 - 一貫性(consistent): null以外の参照値
x
およびy
について、x.equals(y)
の複数の呼出しは、このオブジェクトに対するequals
による比較で使われた情報が変更されていなければ、一貫してtrue
を返すか、一貫してfalse
を返します。 - null以外の参照値
x
について、x.equals(null)
はfalse
を返します。
Object
クラスのequals
メソッドは、もっとも比較しやすいオブジェクトの同値関係を実装します。つまり、null以外の参照値x
とy
について、このメソッドはx
とy
が同じオブジェクトを参照する(x == y
がtrue
)場合にだけtrue
を返します。通常、このメソッドをオーバーライドする場合は、
hashCode
メソッドを常にオーバーライドして、等価なオブジェクトは等価なハッシュ・コードを保持する必要があるというhashCode
メソッドの汎用規約に従う必要があることに留意してください。- パラメータ:
obj
- 比較対象の参照オブジェクト。- 戻り値:
- このオブジェクトがobj引数と同じである場合は
true
、それ以外の場合はfalse
。 - 関連項目:
hashCode()
、HashMap
- 反射性(reflexive): null以外の参照値
-
clone
protected Object clone() throws CloneNotSupportedException
このオブジェクトのコピーを作成して、返します。 コピーの正確な意味合いは、オブジェクトのクラスによって異なります。 一般的な意図は、任意のオブジェクトx
について、次の式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
メソッドをオーバーライドしたサブクラスも、インスタンスを複製できないことを示すためにこの例外をスローすることがある。- 関連項目:
Cloneable
-
toString
public String toString()
オブジェクトの文字列表現を返します。 一般に、toString
メソッドは、このオブジェクトをテキストで表す文字列を返します。 この結果は、人間が読める簡潔で有益な情報であるべきです。 すべてのサブクラスで、このメソッドをオーバーライドすることをお勧めします。クラス
Object
のtoString
メソッドは、オブジェクトがインスタンスになっている元のクラスの名前、アットマーク文字@
、およびオブジェクトのハッシュ・コードの符号なし16進数表現から構成される文字列を返します。 つまり、このメソッドは次の値と等しい文字列を返します。getClass().getName() + '@' + Integer.toHexString(hashCode())
- 戻り値:
- このオブジェクトの文字列表現
-
notify
public final void notify()
このオブジェクトのモニターで待機中のスレッドを1つ再開します。 このオブジェクトで複数のスレッドが待機中の場合は、そのうちの1つを再開します。 この選択は任意で、実装によって異なります。 スレッドは、wait
メソッドを呼び出すと、オブジェクトのモニターで待機します。再開されたスレッドの処理は、現在のスレッドがこのオブジェクトのロックを解除するまでは進むことができません。 再開されたスレッドは、ほかのスレッドと同じように、このオブジェクトと同期するように積極的に競います。たとえば、このオブジェクトをロックする次のスレッドになろうとする場合でも、再開されたスレッドの扱いはほかのスレッドより優勢でも劣勢でもありません。
このメソッドを呼び出すのは、このオブジェクトのモニターを所有するスレッドだけでなければいけません。 スレッドがオブジェクトのモニターのオーナーになる方法は、次の3通りがあります。
- オブジェクトのsynchronizedインスタンス・メソッドを実行する。
- オブジェクトを同期化する
synchronized
文の本体を実行する。 Class
型のオブジェクトの場合は、そのクラスのsynchronized staticメソッドを実行する。
オブジェクトのモニターを所有できるスレッドは1回に1つだけです。
- 例外:
IllegalMonitorStateException
- 現在のスレッドがこのオブジェクトのモニターを所有していない場合。- 関連項目:
notifyAll()
,wait()
-
notifyAll
public final void notifyAll()
このオブジェクトのモニターで待機中のすべてのスレッドを再開します。 スレッドは、wait
メソッドを呼び出すと、オブジェクトのモニターで待機します。再開されたスレッドの処理は、現在のスレッドがこのオブジェクトのロックを解除するまでは進むことができません。 再開されたスレッドは、ほかのスレッドと同じように、このオブジェクトと同期するように積極的に競います。たとえば、このオブジェクトをロックする次のスレッドになろうとする場合でも、再開されたスレッドの扱いはほかのスレッドより優勢でも劣勢でもありません。
このメソッドを呼び出すのは、このオブジェクトのモニターを所有するスレッドだけでなければいけません。 スレッドがオブジェクトのモニターのオーナーになる方法については、
notify
メソッドを参照してください。- 例外:
IllegalMonitorStateException
- 現在のスレッドがこのオブジェクトのモニターを所有していない場合。- 関連項目:
notify()
,wait()
-
wait
public final void wait() throws InterruptedException
現在のスレッドを起動するまで待ちます。通常、notifiedまたはinterruptedです。すべての点で、このメソッドは
wait(0L, 0)
が呼び出されたかのように動作します。 詳細については、wait(long, int)
メソッドの仕様を参照してください。- 例外:
IllegalMonitorStateException
- 現在のスレッドがオブジェクトのモニターを所有していない場合InterruptedException
- 現在のスレッドが待機していた前または中に、現在のスレッドに割り込みが発生した場合。 この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。- 関連項目:
notify()
,notifyAll()
,wait(long)
,wait(long, int)
-
wait
public final void wait(long timeoutMillis) throws InterruptedException
現在のスレッドは、通常、notifiedまたはinterruptedによって、または一定量のリアルタイムが経過するまで、起動するまで待機します。すべての点で、このメソッドは
wait(timeoutMillis, 0)
が呼び出されたかのように動作します。 詳細については、wait(long, int)
メソッドの仕様を参照してください。- パラメータ:
timeoutMillis
- 待機する最大時間(ミリ秒単位)- 例外:
IllegalArgumentException
-timeoutMillis
が負の場合IllegalMonitorStateException
- 現在のスレッドがオブジェクトのモニターを所有していない場合InterruptedException
- 現在のスレッドが待機していた前または中に、現在のスレッドに割り込みが発生した場合。 この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。- 関連項目:
notify()
,notifyAll()
,wait()
,wait(long, int)
-
wait
public final void wait(long timeoutMillis, int nanos) throws InterruptedException
現在のスレッドは、通常、notifiedまたはinterruptedによって、または一定量のリアルタイムが経過するまで、起動するまで待機します。現在のスレッドは、このオブジェクト・モニター・ロックを所有していなければなりません。 スレッドがモニター・ロックの所有者になる方法については、
notify
メソッドを参照してください。このメソッドは、現在のスレッド(ここではTと呼ばれます)をこのオブジェクトの待機セットに配置し、このオブジェクトの同期要求をすべて放棄します。 このオブジェクトのロックだけが解放されることに注意してください。スレッドが待機している間、現在のスレッドが同期化されている他のオブジェクトはロックされたままです。
スレッドTはスレッドのスケジューリングの目的で無効になり、次のいずれかが発生するまで休止状態になります:
- ほかのスレッドがこのオブジェクトに対して
notify
メソッドを呼び出し、再開されるスレッドとしてスレッドTが選ばれた。 - ほかのスレッドがこのオブジェクトに対して
notifyAll
メソッドを呼び出した。 - ほかのスレッドがスレッドTに割り込みをかける。
- 指定された実時間が経過した。 リアルタイムの量(ナノ秒単位)は、式
1000000 * timeoutMillis + nanos
によって与えられます。timeoutMillis
とnanos
が両方ともゼロである場合、実時間は考慮されず、スレッドは他の原因の1つによって起こされるまで待つ。 - スレッドTが偽って起こされます。 (後述の説明を参照してください)
その後スレッドTはこのオブジェクトの待機セットから削除され、スレッドのスケジューリングがふたたび可能になります。 通常の方法で他のスレッドと競合し、オブジェクト上で同期をとることができます。オブジェクトの制御を回復すると、そのオブジェクトに対するすべての同期要求が現状維持に戻されます - つまり、
wait
メソッドが呼び出された時点の状況に戻ります。 次にスレッドTはwait
メソッドの呼び出しから復帰します。 こうして、wait
メソッドから復帰した時点で、オブジェクトおよびスレッドT
の同期ステータスは、wait
メソッドが呼び出されたときとまったく同じになります。スレッドは通知、中断、またはタイムアウトすることなく起きることができます。いわゆる「偽の起床」です。 スプリアス・ウェイクアップは、実際にはまれにしか発生しませんが、アプリケーションでは、スレッドが再開されることで発生する可能性がある条件をテストし、条件が満たされない場合は待機を続けて、スプリアス・ウェイクアップから保護しなければいけません。 次の例を参照してください。
このトピックの詳細については、Joshua Bloch 「効果的なJava、第2版」 (Addison-Wesley, 2008)のBrian Goetz他のJava Concurrency in Practice (Addison-Wesley, 2006)またはItem 69のセクション14.2、"条件待ち行列、"を参照してください。
現在のスレッドの待機中または待機前に任意のスレッドから割り込みがかかった場合、
InterruptedException
がスローされます。 この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。 この例外は、このオブジェクトのロック・ステータスが前述のように復元されるまではスローされません。- APIの注:
- 待機するための推奨される方法は、以下の例に示すように、
wait
への呼び出しの周りのwhile
ループで待っている状態をチェックすることです。 とりわけ、このアプローチは、偽のウェイ・ク アップによって引き起こされる可能性のある問題を回避します。synchronized (obj) { while (<condition does not hold> and <timeout not exceeded>) { long timeoutMillis = ... ; // recompute timeout values int nanos = ... ; obj.wait(timeoutMillis, nanos); } ... // Perform action appropriate to condition or timeout }
- パラメータ:
timeoutMillis
- 待機する最大時間(ミリ秒単位)nanos
- 追加の時間(ナノ秒単位)、0〜99999の範囲- 例外:
IllegalArgumentException
-timeoutMillis
が負の場合、またはnanos
の値が範囲外の場合IllegalMonitorStateException
- 現在のスレッドがオブジェクトのモニターを所有していない場合InterruptedException
- 現在のスレッドが待機していた前または中に、現在のスレッドに割り込みが発生した場合。 この例外がスローされると、現在のスレッドの割込みステータスはクリアされる。- 関連項目:
notify()
,notifyAll()
,wait()
,wait(long)
- ほかのスレッドがこのオブジェクトに対して
-
finalize
@Deprecated(since="9") protected void finalize() throws Throwable
非推奨。ファイナライズの仕組みは本質的に問題です。 ファイナライズは、パフォーマンスの問題、デッドロック、ハングにつながる可能性があります。 ファイナライザのエラーはリソース・リークを引き起こす可能性があります。不要になった場合はファイナライズを取消する方法はありません。異なるオブジェクトのfinalize
メソッドへの呼び出しの間で順序付けは指定されません。 さらに、ファイナンシングのタイミングに関しては保証はありません。finalize
メソッドは、ファイナライズ可能なオブジェクトに対して、不明確な遅延の後にのみ呼び出されることがあります。 インスタンスが非ヒープ・リソースを保持するクラスは、それらのリソースの明示的な解放を可能にするメソッドを提供する必要があります。また、必要に応じてAutoCloseable
も実装する必要があります。Cleaner
とPhantomReference
は、オブジェクトが到達不能になったときにリソースを解放するための、より柔軟で効率的な方法を提供します。このオブジェクトへの参照はもうないとガベージ・コレクションによって判断されたときに、ガベージ・コレクタによって呼び出されます。 サブクラスはfinalize
メソッドをオーバーライドして、システム・リソースを破棄したり、その他のクリーンアップを行ったりすることができます。finalize
の一般的な規約では、その呼出しは、まだ生存している任意のスレッドがこのオブジェクトにアクセスできる方法はもうないと、Java™仮想マシンが判断した場合に行われます。ただし、ファイナライズの準備が済んだ他のオブジェクトまたはクラスをファイナライズするためのアクションの結果そうなった場合を除きます。finalize
メソッドは、このオブジェクトを別のスレッドでふたたび利用可能にすることも含めて、任意のアクションを行うことができます。しかし、finalize
の通常の用途は、オブジェクトを再生不可能な形で破棄する前のクリーンアップを実行することです。 たとえば、入出力の接続を表すオブジェクトのfinalizeメソッドは、オブジェクトが永久的に破棄される前に、接続を切断するための明示的な入出力処理を行います。Object
クラスのfinalize
メソッドは、特別な処理を行いません。通常は、何もしないで復帰します。Object
のサブクラスは、この定義をオーバーライドすることができます。Javaプログラミング言語は、任意のオブジェクトについてどのスレッドが
finalize
メソッドを呼び出すかを保証しません。 しかし、finalizeを呼び出すスレッドが、ユーザーに可視な同期ロックをfinalize呼出しの時点では保持していないことについては保証されます。 キャッチされない例外をfinalizeメソッドがスローした場合、例外は無視され、オブジェクトのファイナライズは終了します。あるオブジェクトについて
finalize
メソッドが呼び出されたあとに次の処理が発生するのは、まだ生存している任意のスレッドがこのオブジェクトにアクセスできる方法はないと、Java Virtual Machineがふたたび判断したときです。これには、ファイナライズの準備ができているほかのオブジェクトまたはクラスによって発生した処理も含まれ、その時点でこのオブジェクトは破棄されます。任意のオブジェクトについてJava Virtual Machineが
finalize
メソッドを複数回呼び出すことはありません。finalize
メソッドによって例外がスローされると、finalizeメソッドの処理は停止されます。そうでない場合は無視されます。- APIの注:
- 非ヒープ・リソースを埋め込んだクラスには、それらのリソースをクリーンアップするための多くのオプションがあります。 クラスは、各インスタンスのライフ・タイムが、埋め込むリソースの存続期間よりも長くなるようにする必要があります。
Reference.reachabilityFence(java.lang.Object)
を使用して、オブジェクトに埋め込まれたリソースが使用されている間に、オブジェクトが到達可能な状態を維持できるようにすることができます。サブクラスは、インスタンスが収集される前にクリーンアップされなければならない非ヒープ・リソースを埋め込む場合を除いて、
finalize
メソッドをオーバーライドしないでください。 ファイナライザの呼び出しは、コンストラクタとは異なり、自動的に連鎖されません。 サブクラスがfinalize
をオーバーライドする場合は、スーパークラス・ファイナライザを明示的に呼び出す必要があります。 finalizeチェーンを途中で終了する例外を防ぐため、サブクラスはtry-finally
ブロックを使用して、super.finalize()
が常に呼び出されるようにする必要があります。 次に例を示します。@Override protected void finalize() throws Throwable { try { ... // cleanup subclass state } finally { super.finalize(); } }
- 例外:
Throwable
- このメソッドで生じたException
- 関連項目:
WeakReference
,PhantomReference
- Java™言語仕様:
- 12.6 クラス・インスタンスのファイナライズ
-
-