モジュール java.base
パッケージ java.lang

クラスObject



  • public class Object
    Objectクラスは、クラス階層のルートです。 すべてのクラスは、スーパー・クラスとしてObjectを持ちます。 配列を含むすべてのオブジェクトは、このクラスのメソッドを実装します。
    導入されたバージョン:
    1.0
    関連項目:
    クラス
    • コンストラクタのサマリー

      コンストラクタ 
      コンストラクタ 説明
      Object​()
      新しいオブジェクトを構築します。
    • メソッドのサマリー

      すべてのメソッド インスタンス・メソッド 具象メソッド 非推奨のメソッド 
      修飾子と型 メソッド 説明
      protected Object clone​()
      このオブジェクトのコピーを作成して、返します。
      boolean equals​(Object obj)
      このオブジェクトと他のオブジェクトが等しいかどうかを示します。
      protected void finalize​()
      非推奨。 
      ファイナライズの仕組みは本質的に問題です。 ファイナライズは、パフォーマンスの問題、デッドロック、ハングにつながる可能性があります。 ファイナライザのエラーはリソース・リークを引き起こす可能性があります。不要になった場合はファイナライズを取消する方法はありません。異なるオブジェクトのfinalizeメソッドへの呼び出しの間で順序付けは指定されません。 さらに、ファイナンシングのタイミングに関しては保証はありません。 finalizeメソッドは、ファイナライズ可能なオブジェクトに対して、不明確な遅延の後にのみ呼び出されることがあります。 インスタンスが非ヒープ・リソースを保持するクラスは、それらのリソースの明示的な解放を可能にするメソッドを提供する必要があります。また、必要に応じてAutoCloseableも実装する必要があります。 CleanerPhantomReferenceは、オブジェクトが到達不能になったときにリソースを解放するための、より柔軟で効率的な方法を提供します。
      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™言語仕様:
        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メソッドは、可能なかぎり、異なるオブジェクトに対して異なる整数を返します。 (hashCodeは、ある時点におけるオブジェクト・メモリー・アドレスの関数として実装されても実装されなくてもよい。)

        戻り値:
        このオブジェクトのハッシュ・コード値。
        関連項目:
        equals(java.lang.Object), System.identityHashCode(java.lang.Object)
      • 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以外の参照値xy、および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以外の参照値xyについて、このメソッドはxyが同じオブジェクトを参照する(x == ytrue)場合にだけtrueを返します。

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

        パラメータ:
        obj - 比較対象の参照オブジェクト。
        戻り値:
        このオブジェクトがobj引数と同じである場合はtrue、それ以外の場合はfalse
        関連項目:
        hashCode()HashMap
      • 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を実装していると見なされること、および配列型T[]cloneメソッドの戻り値の型はT[] (ここで、Tは任意の参照またはプリミティブ型)です。 実装していない場合、このメソッドはこのオブジェクトのクラスの新しいインスタンスを生成し、そのフィールドをすべて、このオブジェクトの対応する各フィールドの内容で初期化します。これは代入と同様で、フィールドの内容自身が複製されるのではありません。 つまりこのメソッドは、オブジェクトの「シャロー・コピー」を生成しますが、「ディープ・コピー」は生成しません。

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

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

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

        クラスObjecttoStringメソッドは、オブジェクトがインスタンスになっている元のクラスの名前、アットマーク文字「@」、およびオブジェクトのハッシュ・コードの符号なし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​(long timeout)
                        throws InterruptedException
        別のスレッドがこのオブジェクトのnotify()メソッドまたはnotifyAll()メソッドを呼び出すか、指定された時間が経過するまで、現在のスレッドを待機させます。

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

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

        • ほかのスレッドがこのオブジェクトに対してnotifyメソッドを呼び出し、再開されるスレッドとしてスレッドTが選ばれた。
        • ほかのスレッドがこのオブジェクトに対してnotifyAllメソッドを呼び出した。
        • ほかのスレッドがスレッドT割り込みをかける。
        • 指定された実時間が経過した。 timeoutがゼロの場合、実時間が考慮されることはなく、スレッドは通知を受けるまで待機し続ける。
        その後スレッドTはこのオブジェクトの待機セットから削除され、スレッドのスケジューリングがふたたび可能になります。 以後、このスレッドは通常どおりに、オブジェクトと同期化する権利をほかのスレッドと競います。オブジェクトの制御を獲得すれば、オブジェクトに対するこのスレッドの同期要求は、以前の状態、つまり、waitメソッドが呼び出されたときの状態に復元されます。 次にスレッドTwaitメソッドの呼び出しから復帰します。 こうして、waitメソッドから復帰した時点で、オブジェクトおよびスレッドTの同期ステータスは、waitメソッドが呼び出されたときとまったく同じになります。

        スレッドは、通知、割り込み、タイム・アウトなしに再開されることがあります。これは、スプリアス・ウェイクアップと呼ばれています。 スプリアス・ウェイクアップは、実際にはまれにしか発生しませんが、アプリケーションでは、スレッドが再開されることで発生する可能性がある条件をテストし、条件が満たされない場合は待機を続けて、スプリアス・ウェイクアップから保護しなければいけません。 つまり、次のようにループで常に待機が発生するようにする必要があります。

             synchronized (obj) {
                 while (<condition does not hold>)
                     obj.wait(timeout);
                 ... // Perform action appropriate to condition
             }
         
        (このトピックの詳細については、Brian Goetzおよびその他"Java Concurrency in Practice"のセクション14.2、Condition Queues、または、Joshua Bloch "Effective Java (Second Edition)" (Addison-Wesley, 2008)のItem 69を参照してください。

        現在のスレッドの待機中または待機前に任意のスレッドから割り込みがかかった場合、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)と同じ意味になります。

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

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

        @Deprecated(since="9")
        protected void finalize​()
                         throws Throwable
        非推奨。 ファイナライズの仕組みは本質的に問題です。 ファイナライズは、パフォーマンスの問題、デッドロック、ハングにつながる可能性があります。 ファイナライザのエラーはリソース・リークを引き起こす可能性があります。不要になった場合はファイナライズを取消する方法はありません。異なるオブジェクトのfinalizeメソッドへの呼び出しの間で順序付けは指定されません。 さらに、ファイナンシングのタイミングに関しては保証はありません。 finalizeメソッドは、ファイナライズ可能なオブジェクトに対して、不明確な遅延の後にのみ呼び出されることがあります。 インスタンスが非ヒープ・リソースを保持するクラスは、それらのリソースの明示的な解放を可能にするメソッドを提供する必要があります。また、必要に応じてAutoCloseableも実装する必要があります。 CleanerPhantomReferenceは、オブジェクトが到達不能になったときにリソースを解放するための、より柔軟で効率的な方法を提供します。
        このオブジェクトへの参照はもうないとガベージ・コレクションによって判断されたときに、ガベージ・コレクタによって呼び出されます。 サブクラスは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 クラス・インスタンスのファイナライズ