Java Object类中的-----------clone()克隆机制
package java_lang_object;
public class User implements Cloneable {
public Address address;
public int age;
public String name;
public User(int age,String name){
this.age = age;
= name;
this.address = new Address("广州天河");
}
public User clone() throws CloneNotSupportedException{
return (User)super.clone();
}
}package java_lang_object;
public class Address {
public String detail;
public Address(String detail){
this.detail = detail;
}
}package java_lang_object;
/**
* 克隆类测试(Object的clone()只是浅克隆,即不会克隆引用类型的变量)
* @author Administrator
* 1、实现克隆要让类实现Cloneable接口
* 2、重写父类Object中的clone()方法
* 3、克隆只是克隆对象的一个副本(副本:也就是内容都是相同的,都指向同一个对象的堆内存,但是引用不同,分配了两个栈空间)
*/
/*
* 系统提供的clone()方法(也就是Object类提供的clone()方法)是非常高效的,比我们自己写的static clone()高效
*/
public class CloneTest {
/*
* 1、u1、u2分别是两个变量,存放在栈内存中,指向的堆内存地址也不相同(故u1 == u2为false)
* 2、
*/
public static void main(String[] args) throws CloneNotSupportedException {
User u1 = new User(29,"湖北");
//Clone得到u1对象的副本
User u2 = u1.clone();
//两个对象属于两个不同的引用,不相等
System.out.println(u1 == u2);
//两个不同的引用指向的是不同堆内存空间,Address实例变量的值时相等的
/*
* Object类提供的clone()机制只对对象里各实例变量进行“简单复制”,如果实例变量的类型为引用类型
* Object的clone机制也只是简单的复制了引用变量而已(这也是address实例变量相等的原因,因为两个address实例变量
* 指向的是同一个堆内存)
*
*/
System.out.println(u1.address == u2.address);
//实例变量都是相等的
System.out.println(u1.age == u2.age);
System.out.println(u1.address.detail == u2.address.detail);//return true
}
}
















