Java中clone方法的作用

     Java取消了指针的概念,但是这只是Java没有明确地提供指针的概念和语法。实质上每个new语句都返回一个指针的引用。

一、对象和引用的区别:

     1.1 Java在处理基本数据类型(int、char、double等)时,都是采用按值传递;除此之外的其他类型都是按引用的方式执行。

      如:

     

class Obj{
    private String str = "default string";

    public String toString() {
        return str;
    }

    public void setStr(String str) {
        this.str = str;
    }
}

public class TestRef {
    public Obj obj = new Obj();

    public Obj getObj() {
        return obj;
    }

    int aInt = 0;

    public int getInt() {
        return aInt;
    }

    public void changeObj(Obj inObj) {
        inObj.setStr("change string");
    }

    public void changeInt(int inInt) {
        inInt=1;
//        this.aInt=inInt=1;  //如果这样就将值改变了
    }

    public static void main(String[] args) {
        TestRef oRef = new TestRef();
        System.out.println(oRef.getObj());   //Obj类重载了toString()方法,打印的时候默认调用对象的此方法,所以就输出字符串了
        oRef.changeObj(oRef.getObj());   //传递的为引用
        System.out.println(oRef.getObj());
        System.out.println(oRef.getInt());
        oRef.changeInt(oRef.getInt());  //change的变量为inInt
        System.out.println(oRef.getInt());  //get的变量为aInt
    }
}
   1.2 对象除了在函数调用时是引用传递,在使用“=”赋值时也采用引用传递

         如:Obj a=new Obj();

                 Obj b=a;        // 传递的引用。

   1.3 使用clone()函数返回Object对象的复制,返回的是新对象而不是对象的引用;拷贝对象与原用new操作符返回对象的区别在于这个拷贝已经包含了原对象的一些信息。

          使用步骤如下:

          1、实现clone的类需要继承Cloneable接口。Cloneable接口实质上是一个标识接口,没有任何接口方法。不继承Cloneable接口会报:CloneNotSupportedException,异常。

         2、重写Object的clone()方法,clone()方法调用super.clone()方法,无论clone的结构是什么,super.clone()都会直接或间接调用Object类的clone()方法。

         3、把浅复制的引用指向原型对象新的克隆体。
 Obj类:

class Obj{
    private int anInt=0;
    public int getAnInt(){
        return anInt;
    }
    public void setInt(int anInt){
        this.anInt=anInt;
    }
    public void changeInt(){
        this.anInt=1;
    }
    public Object clone(){//重写Object类的clone方法
        Object o=null;
        try{
            o=(Obj)super.clone();
        }catch (CloneNotSupportedException e){
            e.printStackTrace();
        }
        return o;
    }
}
Test类:

public class TestRef{
    public Obj obj = new Obj();
    public static void main(String[] args) {
        Obj a=new Obj();
        Obj b=(Obj)a.clone();
        b.changeInt();
        System.out.println(a.getAnInt());
        System.out.println(b.getAnInt());
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值