【Java-常用类】Object类-----Clone()方法
定义:
Object类----是整个类结构中根类, 所有类都直接或者间接继承这个类,每个类都使用 Object 作为超类。所有对象(包括数组)都实现这个类的方法。
构造方法:Object()
子类的构造方法默认访问父类的无参构造
成员方法:protected Object clone()
创建并返回此对象的副本。二者之间都是独立的
注意
1.clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足:
①对任何的对象x,都有x.clone() !=x//克隆对象与原对象不是同一个对象
②对任何的对象x,都有x.clone().getClass()= =x.getClass()//克隆对象与原对象的类型一样
③如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。
2.Java中对象的克隆
①为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。
②在派生类中覆盖基类的clone()方法,并声明为public。
③在派生类的clone()方法中,调用super.clone()。
④在派生类中实现Cloneable接口。
继承自java.lang.Object类的clone()方法是浅复制, 在编写程序时要注意这个细节。
浅复制
浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。
深复制
深复制把要复制的对象所引用的对象都复制了一遍。
自定义类实现克隆的步骤
1.自定义类实现Cloneable接口,这是一个标记性的接口,实现了这个接口的类才可以克隆。
2.自定义类要重写Object中的clone()方法
3. 重写clone()方法通过super.clone() 调用父类中的方法得到该对象的副本并返回该副本
实现Cloneable接口
package com.momo.domain;
//实现标记接口
public class User implements Cloneable{
private int id;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//重写父类克隆方法
@Override
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
测试类
package com.momo.test;
import com.momo.domain.User;
public class Demo {
public static void main(String[] args) throws CloneNotSupportedException {
//创建一个对象
User u = new User();
u.setId(111);
u.setName("abc");
//调用方法实现克隆
Object obj = u.clone();
User u2 = (User)obj;
System.out.println(u.getId()+","+u.getName());
System.out.println(u2.getId()+","+u2.getName());
System.out.println(u == u2);
System.out.println(u);
System.out.println(u2);
//注意区别
User u3 = u;
System.out.println(u3);
}
}
运行结果
由此可见,从1,2句可以看出拷贝出来的新对象与原对象内容一致,从第3句可以看出克隆出来的对象和原对象都是独立的个体,原对象与新对象是两个不同的对象。后面输出的地址值可以清晰的看出是否为同一对象。