了解Object是非常有必要的,Object类是Java里的根类,即Java其他类都使用Object类作为超类。
所有的对象(包括数组)都实现这个类的方法,Object类里的方法在任何对象上都可以使用。
----------------------------------------常用方法-----------------------------------------------
protected Object clone() | 创建并返回此对象的一个副本,默认采用浅克隆的方式,如果子类需要深克隆,可以覆盖该方法。 |
boolean equals(Object obj) | 判断其他某个对象obj是否与此对象相等。 |
Class<?> getClass() | 返回此 Object 的运行时类。 |
int hashCode() | 返回该对象的哈希码值。 |
String toString() | 返回该对象的字符串表示。 |
(1)protected Object clone( )
protected native Object clone() throws CloneNotSupportedException
从Object类的源码中可以看出Object 类本身不实现接口 Cloneable,所以在类为 Object 的对象上调用 clone 方法将会导致在运行时抛出异常。Object的clone()方法采用浅克隆的方式。若子类有深克隆的需求,需实现cloneable接口,并覆盖clone( )方法。
浅克隆的复制方式为:对基础数据类型在内存里复制一份,对其他类型则采用引用的方式,所以浅克隆存在安全隐患。
Object类的clone()方法是一个native方法,native方法的效率一般来说都是远高于Java中的非native方法。这也解释了为什么要用Object中clone()方法而不是先new一个类,然后把原始对象中的信息复制到新对象中。Object.clone()方法返回一个Object对象。我们必须进行强制类型转换才能得到我们需要的类型。
(2)boolean equals(Object obj)
public boolean equals(Object obj) { return (this == obj); }
从源码可以看出,默认是调用==操作符去比较两个对象的地址,而不是对象的值。如果子类需要通过两个对象的值来判断对象是否相等,需在子类重写该方法。当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。我们很大部分时间都是进行两个对象的比较,这时Object的equals()方法就满足不了需求,实际上JDK中,String、Math等封装类都对equals()方法进行了重写。
(3)Class<?> getClass( )
//源码 public final native Class<?> getClass();
public class Test //实例 { public static void main(String[] args) { String str= new String(); System.out.println(str.getClass()); } }
//输出 class java.lang.String(4)int hashCode( )
public native int hashCode();
Object本地实现的hashCode()方法计算的值是底层代码的实现,采用多种计算参数,返回的并不一定是对象的(虚拟)内存地址,具体取决于运行时库和JVM的具体实现。
重写hashCode()方法的基本规则:
在 Java 应用程序执行期间,对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数。如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象调用 hashCode 方法都必须生成相同的整数结果。
(5)String toString()
public String toString()//源码 { return getClass().getName() + "@" + Integer.toHexString(hashCode()); }Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成,并不是一个简明但易于读懂的信息表达式。 建议所有子类都重写此方法。