Object类

2016/12/10 Java

Object类

所有类都直接或者间接的继承自该类

public int hashCode()

  • 返回该对象的哈希码值。默认情况下,该方法会根据对象的地址来计算。
    • 不是对象的实际地址值,可以理解为逻辑地址值。
  • 不同对象的,hashCode()一般来说不会相同。同一个对象的hashCode()值肯定相同。

public final Class getClass()

*返回此 Object 的运行时类。 *可以通过Class类中的一个方法,获取对象的真实类的全名称。 public String getName()

B b = new C();
b.show();//调用父类show后调用子类show2
System.out.println(b.getClass().getName());//com.xpress.javase.polymorphisn.C

public String toString()

  • 返回该对象的字符串表示。
    public static String valueOf(Object obj) {
      return (obj == null) ? "null" : obj.toString();
    }
    
  • 它的值等于:
    getClass().getName() + '@' + Integer.toHexString(hashCode()) 
    
  • 由于默认情况下的数据对我们来说没有意义,一般建议重写该方法。
    • 手动重写
    • 自动生成

public boolean equals(Object obj)

  • 指示其他某个对象是否与此对象“相等”。
  • 默认情况下比较的是对象的引用是否相同。
  • 由于比较对象的引用没有意义,一般建议重写该方法。
    • 手动重写
    • 自动生成

==和equals()的区别

  • ==
    • 基本类型:比较的是值是否相同
    • 引用类型:比较的是地址值是否相同
  • equals()
    • 只能比较引用类型。默认情况下,比较的是地址值是否相同。
    • 但是,我们可以根据自己的需要重写该方法。

protected void finalize()

  • 当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法。
  • 垃圾回收器不会马上回收垃圾,但是我们可以建议它尽快回收垃圾。(System.gc()方法)
  • 主要针对堆内存。

protected Object clone()

  • 创建并返回此对象的一个副本,这种克隆机制十分高效,而且二者之间完全隔离。
  • 自定义类实现克隆步骤:
    • 自定义类实现Cloneable接口,这是一个标记性接口,实现这个接口的类的对象可以实现自我克隆。
    • 自定义类中重写Object类的clone()方法。
    • 重写clone()方法时通过super.clone()调用Object类的clone()方法来得到该对象的副本,并返回该副本。

注意:

  • 克隆和两个引用指向同一个对象的区别?
  • Object类clone()方法虽然简单,易用,但仅仅是一种”浅克隆”,它只克隆该对象所有的Field值,不会对引用类型的Field所引用的对象进行克隆。开发中,我们也可以实现对象的”深度克隆”。
    • js深克隆使用 $.extend(true,oldObj, newObj);

深克隆实现方法之

  • 通过Gson等工具转换成json数据后在转换回来
  • 对成员变量对象引用依次克隆
class Professor {
    String name; 
    int age; 
    Professor(String name,int age) { 
        this.name=name; 
        this.age=age; 
    } 
} 
public class Student implements Cloneable {
	String name;// 常量对象。 
	int age; 
	Professor p;// 学生1和学生2的引用值都是一样的。 
	Student(String name,int age,Professor p) { 
	    this.name=name; 
	    this.age=age; 
	    this.p=p; 
	} 
	public Object clone() { 
	    Student o=null; 
	    try {
	        o=(Student)super.clone(); 
	    }catch(CloneNotSupportedException e) {
	        e.printStackTrace(); 
	    } 
	    o.p=(Professor)p.clone(); // 实现引用成员变量对象引用克隆
	    return o; 
	}
}
  • 利用串行化来做深复制
// 对象实现Serializable接口
public Object deepClone() {
	//将对象写到流里 
	ByteArrayOutoutStream bo=new ByteArrayOutputStream(); 
	ObjectOutputStream oo=new ObjectOutputStream(bo); 
	oo.writeObject(this); 
	//从流里读出来 
	ByteArrayInputStream bi=new ByteArrayInputStream(bo.toByteArray()); 
	ObjectInputStream oi=new ObjectInputStream(bi); 
	return(oi.readObject()); 
}

Search

    Post Directory