Object类

方法

  • 获取对象的Class对象引用
    Class getClass()
  • 计算hash值
    int hashCode();
  • equals方法
    Java中的 == 用于对象时比较时,仅判断引用是否相等。
    boolean equals(); //默认实现语义同 '==' 运算符
  • clone()
    Object clone();
  • toString()
    String toString();
  • notify()
    void notify();
  • notifyAll()
    void notifyAll();
  • wait();
    void wait(timeout)
    void wait()

拷贝

如果利用clone()方法拷贝,需要实现cloneable 接口
因为对象中属性可能存在引用类型,所以就有所谓的深拷贝与浅拷贝。

  • 浅拷贝,新旧对象的引用指向同一内存区域。
Class Birthday{
  int year;
  int month;
  ...
}
class Person{
  String name;//String类型(特殊)
  int age;//基本数据类型
  Birthday birthday;//引用类型
  ...
}
main(){
  Person p1 = new Person("beauty", 18, new Birthday(2018, 12, 25));
  Person p2 = person.clone();
  p1.birthday == p2.birthday;//true,birthday属性指向同一内存空间,浅拷贝。 
}
  • 深拷贝:对于有引用类型(除不可变对象的引用(如String)外)的对象,一般考虑深拷贝
//深拷贝需要覆写 clone方法
//Person类的clone()方法覆写
public Object clone(){
      Person p = (Person)super.clone();
      p.setBirthday((Birthday)this.birthday.clone());//属性所属类也需要实现Cloneable接口
      return p;
}
//Birthday的clone()方法覆写
public Object clone(){
  return super.clone();//因为该类中没有引用类型。
}

关键点

  • 通过clone方法的覆写来实现深拷贝,往往需要类层次结构每个类都实现深拷贝
  • 可以考虑将类设计为不可变对象(如string),来简化深拷贝的实现。
  • 不可变对象设计,可以考虑将内部属性申明为final的方式。

你可能感兴趣的:(Object类)