您的位置 首页 java

Object的clone()方法、深拷贝、浅拷贝

Object的clone()方法、深拷贝、浅拷贝

obj.clone().getClass()==obj.getClass(),即它们具有相同的类型。还有一点,因为只是简单的将对象的空间进行复制,所以如果类具有引用类型的实例变量的话,也只是将这个引用进行拷贝,并不复制其引用的对象。 这就导致拷贝对象的引用实例变量与原对象的指向相同的对象,这就是传说中的“浅拷贝”

如果实例变量引用的对象是不可变的,类似于String,则拷贝对象与原对象不能互相影响,这样的拷贝是成功的。但是如果引用的是可变对象,它们就会影响彼此,对于成功的拷贝而言,这是不允许的。可以对可变的实例变量对象进行特殊处理,以实现拷贝对象和原对象不能相互影响的“深拷贝”。

由于Object.clone()方法是 protected 的,所以它只能在lang包中的类或是其子类的方法内部被调用,所以,如果像下面这样调用,会编译出错,在Person kobe_bak=kobe.clone();报错,说clone只能在Object的protected 作用域 访问。

clone方法的作用域限制不允许我们在其它地方访问,那我们就重写Object的clone方法,并扩大访问作用域为public,在Person类中添加clone的方法重写,调用super.clone(),也就是Object.clone()。

package com.rickie.objectclone;

import java.util.Date;

public class Person implements Cloneable

{

private int age;

private String name;

private Date birth;

public Person(int a,String n,Date b){

age=a;

name=n;

birth=b;

}

@Override

public Person clone() throws CloneNotSupportedException {

// return (Person)super.clone();

Person p = (Person)super.clone();

//Date类型的birth域是可变的,需要对其克隆,进行深拷贝

//Date类实现的克隆,直接调用即可

p.birth = (Date)this.birth.clone();

return p;

}

public static void main(String[] args) throws CloneNotSupportedException {

Person kobe=new Person(33,”kobe”,new Date());

Person kobe_bak=kobe.clone();

System.out.println(kobe.equals(kobe_bak)); // false

System.out.println(kobe. hashCode () == kobe_bak.hashCode()); // false

System.out.println(kobe.birth == kobe_bak.birth); // 浅拷贝:true 深拷贝: false

System.out.println(kobe.birth.equals(kobe_bak.birth)); // 浅拷贝:true 深拷贝: true

System.out.println(kobe.getClass() + ” ** ” + kobe_bak.getClass()); // class com.rickie.objectclone.Person

}

}

运行结果:

文章来源:智云一二三科技

文章标题:Object的clone()方法、深拷贝、浅拷贝

文章地址:https://www.zhihuclub.com/197079.shtml

关于作者: 智云科技

热门文章

网站地图