java.lang.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 Constructors | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Constructs a new instance of
Object . |
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Compares this instance with the specified object and indicates if they
are equal.
| |||||||||||
Returns the unique instance of
Class that represents this
object's class. | |||||||||||
Returns an integer hash code for this object.
| |||||||||||
Causes a thread which is waiting on this object's monitor (by means of
calling one of the
wait() methods) to be woken up. | |||||||||||
Causes all threads which are waiting on this object's monitor (by means
of calling one of the
wait() methods) to be woken up. | |||||||||||
Returns a string containing a concise, human-readable description of this
object.
| |||||||||||
Causes the calling thread to wait until another thread calls the
notify() or notifyAll() method of this object. | |||||||||||
Causes the calling thread to wait until another thread calls the
notify() or notifyAll() method of this object or until the
specified timeout expires. | |||||||||||
Causes the calling thread to wait until another thread calls the
notify() or notifyAll() method of this object or until the
specified timeout expires. |
Protected Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
Creates and returns a copy of this
Object . | |||||||||||
Called before the object's memory is reclaimed by the VM.
|
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.
o | the object to compare this instance with. |
---|
true
if the specified object is equal to this Object
; false
otherwise.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 l = new ArrayList();
Class extends List> c = l.getClass();
Class
instance.
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.
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
virtual machine. 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
synchronized
statement that
synchronizes on the object;Class
.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
synchronized
statement that
synchronizes on the object;Class
.IllegalMonitorStateException | if the thread calling this method is not the owner of this object's monitor. |
---|
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.
Causes the calling thread to wait until another thread calls the notify()
or notifyAll()
method of this object. 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
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.
IllegalMonitorStateException | if the thread calling this method is not the owner of this object's monitor. |
---|---|
InterruptedException | if another thread interrupts this thread while it is waiting. |
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.
millis | the maximum time to wait in milliseconds. |
---|---|
nanos | the fraction of a millisecond to wait, specified in nanoseconds. |
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 another thread interrupts this thread while it is waiting. |
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
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.
millis | the maximum time to wait in milliseconds. |
---|
IllegalArgumentException | if millis < 0 . |
---|---|
IllegalMonitorStateException | if the thread calling this method is not the owner of this object's monitor. |
InterruptedException | if another thread interrupts this thread while it is waiting. |
Creates and returns a copy of this Object
. The default
implementation returns a so-called "shallow" copy: It creates a new
instance of the same class and then copies the field values (including
object references) from this instance to the new instance. A "deep" copy,
in contrast, would also recursively clone nested objects. A subclass that
needs to implement this kind of cloning should call super.clone()
to create the new instance and then create deep copies of the nested,
mutable objects.
CloneNotSupportedException | if this object's class does not implement the Cloneable interface.
|
---|
Called before the object's memory is reclaimed by the VM. This can only happen once the garbage collector has detected that the object is no longer reachable by any thread of the running application.
The method can be used to free system resources or perform other cleanup
before the object is garbage collected. The default implementation of the
method is empty, which is also expected by the VM, but subclasses can
override finalize()
as required. Uncaught exceptions which are
thrown during the execution of this method cause it to terminate
immediately but are otherwise ignored.
Note that the VM does guarantee that finalize()
is called at most
once for any object, but it doesn't guarantee when (if at all) finalize()
will be called. For example, object B's finalize()
can delay the execution of object A's finalize()
method and
therefore it can delay the reclamation of A's memory. To be safe, use a
ReferenceQueue
, because it provides more control
over the way the VM deals with references during garbage collection.
Throwable | any exception which is raised during finalization; these are ignored by the virtual machine. |
---|