1.getClass()
public final 类<?> getClass()
这个方法返回的是Object的运行类。返回的类对象是被表示类的static synchronized方法锁定的对象。
实际结果的类型是Class<? extends |x|> 其中的|x|是静态类型上其表达的擦除getClass被调用。例如,在此代码片段中不需要转换:
Number n = 0;
Class<? extends Number> c = n.getClass();
结果
表示类对象的运行时类的Class对象。
2.hashCode()
public int hashCode()
这个方法是返回对象的哈希码值。支持这种方法是为了散列表,如HashMap提供的那样。
hashCode的作用是:
- 只要在执行Java应用程序时多次在同一个对象上调用此方法,hashCode方法必须始终返回相同的整数,前提是修改了对象中equals方法中的比较信息。该整数不需要从一个应用程序的执行到相同应用程序的另一个执行保持一致。
- 如果根据equals(Object)方法两个对象相等,则在两个对象中的每个对象调用hashCode()方法必须产生相同的整数结果。
- 要求如如果两个对象根据equals(Object)方法不相等,那么在两个对象中的每个对象上调用hashCode()方法必须产生不同的整数结果。但是,程序员应该意识到,为何不相等对象生成不同的整数结果可能会提高哈希表的性能。
所以,尽可能的合理使用,由类Obejct定义的hashCode方法确实为不同的对象返回不同的整数。(这通常通过将对象的内部地址转换为整数来实现,但是Java的编程语言不需要这样实现)
结果:
该对象的哈希码值
3.equals()
public boolean equals(Object obj)
指一些其他对象是否等于此对象
equals方法在非空对象引用上实现等价关系:
- 自反性:对于任何非空的参考值x,x.equals(x)应该返回true。
- 他是对称的:对于任何非空值x和y,x.equal(y)应该返回true,而且仅当y.equals(x)返回true
- 传递性:对于任何非空引用值x,y和z,如果x.equals(y)返回true且y.equals(z)返回true,那么x.equals(z)也应该返回true
- 一致性:对任何非空引用值x和y,多次调用x.equals(y)始终返回true或者使用返回false,没有设置中使用的信息equals比较上的对象呗修改。
- 对于任何非空的参考值x,x.equals(null)一直返回false
该equasl()方法Obejct实现对象上差别可能性最大的相等关系;也就是说,对于任何非空的参考值x和y,且仅当x和y引用相同的对象(x==y)返回true
请注意:无论何时覆盖该方法,通过需要覆盖hashCode方法,以便维护hashCode方法的通用,该方法规定相等的对象必须具有相等的哈希码。
参数
Object obj:与之比较的参考对象
结果:
如果与此对象obj参数相同,则返回true,否则返回false
4.clone()
protected Obejct clone() throws CloneNotSupportedeException
创建并返回该对象的副本。“复制”的精确含义可能要取决于对象的类。一般的作用的是,对于任何对象x,表达式:
object.clone() != object;
将是正确的,而且表达式:obejct.clone().getClass() == object.getClass()将返回true,但是这些都不是绝对要求。
通常判断是:
object.clone().equals(object)
这个结果是true。这不是一个绝对的要求。
按照惯例,返回的对象应该通过调用super.clone()获取。如果一个类和它的所有超类(除了Object)遵守一个惯例,那么将是object.clone().getClass() == object.getClass()的情况。
按照惯例,此方法返回的对象应该与此对象(正在被克隆)无关。为了实现这一个独立性,可能需要修改super.clone()返回的对象的一个或多个字段。通常,这意味着复制构成被克隆的对象内部“深层结构”的任何可变对象,并且通过该副本替换对这些对象的引用。如果一个类仅仅包含原始字段或者对不可变对象的引用,则通常情况下,super.clone()返回的对象中的字段通常不需要修改。
Object的clone()方法执行特定的克隆操作时。首先,如果此对象的类不实现接口Cloneable,则抛出CloneNotSupportedException。请注意,所有数组都被认为是实现接口Cloneable,并且数组类型T[]的clone()方法的返回类型是T[],其中T为任何引用或原始类型。否则,该方法将创建该对象的新实例,并将其所有字段初始化为完全符合该对象的相应字段的内容,就像通过赋值一样。这些字段的内容本身不被克隆。因此,该方法执行该对象的“浅拷贝”,而不是“深度拷贝”操作。
Object类本身并不实现接口Cloneable,因此在类别为Object的对象上调用clone方法将导致运行时抛出异常。
结果:
返回这个实例的一个克隆对象
5.toString()
public String toString()
返回对象的字符串表现形式。一般来说,toString()返回一个“textually代表”这个对象的字符串。结果应该是一个简单明了的表达,可读性非常高。所以建议所有子类覆盖此方法。
Object该toString()方法返回一个由其中的对象是一个实例,该字符符号'的类的名称字符串@和对象的哈希码的无符号的十六进制表示。换句话说:这个方法返回一个等于下列值的字符串:
getClass().getName() + "@" + Integer.toHexString(hashCode())
结果:
对象的字符串表现形式
6.notify()
public final void notify()
唤醒正在等待对象监视器的单个线程。如果任何线程正在等待这个对象,其中的一个选择被唤醒。选择的随机的,并且由实施的判断发生。线程通过调用wait方法之一等待对象的监视器。
唤醒的线程将无法继续,知道当前线程放弃此对象上的锁定为止。唤醒的线程将以通常的方式和任何其他线程竞争,这些线程可能正在积极的在该对象上竞争同步;例如,唤醒的线程在下一个锁定该对象的线程中没有可靠的权限或者缺点。
该方法只能由作为该对象的监视器的所有者的线程调用。线程以三种方式之一成为对象监视器的所有者:
- 通过执行该对象的同步实例方法。
- 通过执行在对象上synchronized synchronized语句的正文。
- 对于类型为Class的对象,通过执行该类的同步静态方法。
一次只能有一个线程可以拥有一个对象的显示器。
7.notifyAll()
public final void notifyAll()
唤醒正在等待对象监视器的所有线程。线程通过调用wait等方法等待对象的监视器。
唤醒的线程将无法继续,知道当前线程释放该对象上的锁。唤醒的线程将以通常的方式与任何其他线程竞争,这些线程可能正在积极的在该对象上同步竞争;例如:唤醒的线程在下一个锁定该对象的线程中不会有可靠的特权或者缺点。
该方法只能由作为该对象的监视器的所有者的线程调用。有关线程可以成为监视器所有者的方法的说明,同notify()方法。
8.wait()
public final void wait() throws InterruptedException
导致当前线程等待,直到另一个线程调用该对象的notify()方法或notifyAll()
方法。 换句话说,这个方法的行为就好像简单地执行呼叫wait(0)
。
9.finalize()
protected void finalize() throws Throwable
当垃圾收集确定不再有对该对象的引用时,垃圾收集器在对象上调用该对象。 一个子类覆盖了处理系统资源或执行其他清理的finalize
方法。