Object

public class Object

The root class of the Java class hierarchy. All non-primitive types (including arrays) inherit either directly or indirectly from this class.

Writing a correct equals method

Follow this style to write a canonical equals method:

   // Use @Override to avoid accidental overloading.
   @Override public boolean equals(Object o) {
     // Return true if the objects are identical.
     // (This is just an optimization, not required for correctness.)
     if (this == o) {
       return true;
     }

     // Return false if the other object has the wrong type.
     // This type may be an interface depending on the interface's specification.
     if (!(o instanceof MyType)) {
       return false;
     }

     // Cast to the appropriate type.
     // This will succeed because of the instanceof, and lets us access private fields.
     MyType lhs = (MyType) o;

     // Check each field. Primitive fields, reference fields, and nullable reference
     // fields are all treated differently.
     return primitiveField == lhs.primitiveField &&
             referenceField.equals(lhs.referenceField) &&
             (nullableField == null ? lhs.nullableField == null
                                    : nullableField.equals(lhs.nullableField));
   }
 

If you override equals, you should also override hashCode: equal instances must have equal hash codes.

See Effective Java item 8 for much more detail and clarification.

Writing a correct hashCode method

Follow this style to write a canonical hashCode method:

   @Override public int hashCode() {
     // Start with a non-zero constant.
     int result = 17;

     // Include a hash for each field.
     result = 31 * result + (booleanField ? 1 : 0);

     result = 31 * result + byteField;
     result = 31 * result + charField;
     result = 31 * result + shortField;
     result = 31 * result + intField;

     result = 31 * result + (int) (longField ^ (longField >>> 32));

     result = 31 * result + Float.floatToIntBits(floatField);

     long doubleFieldBits = Double.doubleToLongBits(doubleField);
     result = 31 * result + (int) (doubleFieldBits ^ (doubleFieldBits >>> 32));

     result = 31 * result + Arrays.hashCode(arrayField);

     result = 31 * result + referenceField.hashCode();
     result = 31 * result +
         (nullableReferenceField == null ? 0
                                         : nullableReferenceField.hashCode());

     return result;
   }
 

If you don't intend your type to be used as a hash key, don't simply rely on the default hashCode implementation, because that silently and non-obviously breaks any future code that does use your type as a hash key. You should throw instead:

   @Override public int hashCode() {
     throw new UnsupportedOperationException();
   }
 

See Effective Java item 9 for much more detail and clarification.

Writing a useful toString method

For debugging convenience, it's common to override toString in this style:

   @Override public String toString() {
     return getClass().getName() + "[" +
         "primitiveField=" + primitiveField + ", " +
         "referenceField=" + referenceField + ", " +
         "arrayField=" + Arrays.toString(arrayField) + "]";
   }
 

The set of fields to include is generally the same as those that would be tested in your equals implementation.

See Effective Java item 10 for much more detail and clarification.

Public Constructor Summary

Object()
Constructs a new instance of Object.

Public Method Summary

boolean
equals(Object obj)
Compares this instance with the specified object and indicates if they are equal.
final Class<?>
getClass()
Returns the unique instance of Class that represents this object's class.
int
hashCode()
Returns an integer hash code for this object.
final void
notify()
Causes a thread which is waiting on this object's monitor (by means of calling one of the wait() methods) to be woken up.
final void
notifyAll()
Causes all threads which are waiting on this object's monitor (by means of calling one of the wait() methods) to be woken up.
String
toString()
Returns a string containing a concise, human-readable description of this object.
final void
wait(long timeout, int nanos)
Causes the calling thread to wait until another thread calls the notify() or notifyAll() method of this object or until the specified timeout expires.
final void
wait(long timeout)
Causes the calling thread to wait until another thread calls the notify() or notifyAll() method of this object or until the specified timeout expires.
final void
wait()
Causes the calling thread to wait until another thread calls the notify() or notifyAll() method of this object.

Protected Method Summary

Object
clone()
Creates and returns a copy of this Object.
void
finalize()
Invoked when the garbage collector has detected that this instance is no longer reachable.

Public Constructors

public Object ()

Constructs a new instance of Object.

Public Methods

public boolean equals (Object obj)

Compares this instance with the specified object and indicates if they are equal. In order to be equal, o must represent the same object as this instance using a class-specific comparison. The general contract is that this comparison should be reflexive, symmetric, and transitive. Also, no object reference other than null is equal to null.

The default implementation returns true only if this == o. See Writing a correct equals method if you intend implementing your own equals method.

The general contract for the equals and hashCode() methods is that if equals returns true for any two objects, then hashCode() must return the same value for these objects. This means that subclasses of Object usually override either both methods or neither of them.

Parameters
obj the object to compare this instance with.
Returns
  • true if the specified object is equal to this Object; false otherwise.
See Also

public final Class<?> getClass ()

Returns the unique instance of Class that represents this object's class. Note that getClass() is a special case in that it actually returns Class<? extends Foo> where Foo is the erasure of the type of the expression getClass() was called upon.

As an example, the following code actually compiles, although one might think it shouldn't:

List<Integer> l = new ArrayList<Integer>();
   Class<? extends List> c = l.getClass();

Returns
  • this object's Class instance.

public int hashCode ()

Returns an integer hash code for this object. By contract, any two objects for which equals(Object) returns true must return the same hash code value. This means that subclasses of Object usually override both methods or neither method.

Note that hash values must not change over time unless information used in equals comparisons also changes.

See Writing a correct hashCode method if you intend implementing your own hashCode method.

Returns
  • this object's hash code.
See Also

public final void notify ()

Causes a thread which is waiting on this object's monitor (by means of calling one of the wait() methods) to be woken up. If more than one thread is waiting, one of them is chosen at the discretion of the VM. The chosen thread will not run immediately. The thread that called notify() has to release the object's monitor first. Also, the chosen thread still has to compete against other threads that try to synchronize on the same object.

This method can only be invoked by a thread which owns this object's monitor. A thread becomes owner of an object's monitor

  • by executing a synchronized method of that object;
  • by executing the body of a synchronized statement that synchronizes on the object;
  • by executing a synchronized static method if the object is of type Class.

public final void notifyAll ()

Causes all threads which are waiting on this object's monitor (by means of calling one of the wait() methods) to be woken up. The threads will not run immediately. The thread that called notify() has to release the object's monitor first. Also, the threads still have to compete against other threads that try to synchronize on the same object.

This method can only be invoked by a thread which owns this object's monitor. A thread becomes owner of an object's monitor

  • by executing a synchronized method of that object;
  • by executing the body of a synchronized statement that synchronizes on the object;
  • by executing a synchronized static method if the object is of type Class.

Throws
IllegalMonitorStateException if the thread calling this method is not the owner of this object's monitor.

public String toString ()

Returns a string containing a concise, human-readable description of this object. Subclasses are encouraged to override this method and provide an implementation that takes into account the object's type and data. The default implementation is equivalent to the following expression:

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

See Writing a useful toString method if you intend implementing your own toString method.

Returns
  • a printable representation of this object.

public final void wait (long timeout, int nanos)

Causes the calling thread to wait until another thread calls the notify() or notifyAll() method of this object or until the specified timeout expires. This method can only be invoked by a thread that owns this object's monitor; see notify() on how a thread can become the owner of a monitor.

A waiting thread can be sent interrupt() to cause it to prematurely stop waiting, so wait should be called in a loop to check that the condition that has been waited for has been met before continuing.

While the thread waits, it gives up ownership of this object's monitor. When it is notified (or interrupted), it re-acquires the monitor before it starts running.

A timeout of zero means the calling thread should wait forever unless interrupted or notified.

Parameters
timeout the maximum time to wait in milliseconds.
nanos the fraction of a millisecond to wait, specified in nanoseconds.
Throws
IllegalArgumentException if millis < 0, nanos < 0 or nanos > 999999.
IllegalMonitorStateException if the thread calling this method is not the owner of this object's monitor.
InterruptedException if the current thread has been interrupted. The interrupted status of the current thread will be cleared before the exception is thrown.

public final void wait (long timeout)

Causes the calling thread to wait until another thread calls the notify() or notifyAll() method of this object or until the specified timeout expires. This method can only be invoked by a thread which owns this object's monitor; see notify() on how a thread can become the owner of a monitor.

A waiting thread can be sent interrupt() to cause it to pre