java中clone方法的作用

来源:互联网 发布:直播间软件 编辑:程序博客网 时间:2024/05/22 03:07

java中没有C/C++的指针,给程序员带来很多方便,但是这不意味着java没有指针,实质上每一次new语句返回的都是一个指针的引用。很多时候,我们往往忽略对象和引用的区别
例如:

class obj2{    private int a =0;    public int getA() {        return a;    }    public void setA(int a) {        this.a = a;    }    public void changeA(int b){        this.a=b;    }}public class JavaCloneEq {    public static void main(String[] args) {       obj2 a  = new obj2();       obj2 b = a;       b.changeA(2);       System.out.println("a :" + a.getA());       System.out.println("b :"+ b.getA());    }}

结果:

a :2b :2

对b的修改已经影响到a,因为b是对a的引用,而不是一个全新的复制,所以这个时候就需要引入clone来完成。

class obj2 implements Cloneable{ //实现接口    private int a =0;    public int getA() {        return a;    }    public void setA(int a) {        this.a = a;    }    public void changeA(int b){        this.a=b;    }    //重写clone方法    @Override    protected Object clone() throws CloneNotSupportedException {        // TODO Auto-generated method stub        return super.clone();    }}public class JavaCloneEq {    public static void main(String[] args) {        obj2 a  = new obj2();        obj2 b = null;        try {            b = (obj2) a.clone(); //克隆a        } catch (CloneNotSupportedException e) {            e.printStackTrace();        }        b.changeA(5); //改变b对象中的值       System.out.println("a :" + a.getA());       System.out.println("b :"+ b.getA());    }}

结果:

a :0b :5


使用clone()方法的步骤:
1.实现clone的类首先需要实现Cloneable接口。Cloneable接口实质上是一个标识接口
2.在类中重写Object类中的clone方法
3.在clone方法中调用super.clone()。无论clone类的继承结构是什么,super.clone会直接或间接调用java.lang.Object类的clone()方法。
4.把浅复制的引用指向原型对象新的克隆体。


PS:
java在处理基本数据类型(例如int,double,char等),都采用按值传递(传递的是输入参数的复制),除此之外的其他类型都采用按引用传递(传递的是对象的一个引用)。对象除了在函数调用时是引用传递,在使用“=”赋值时也采用引用传递。

1 0
原创粉丝点击