Java中处理基本数据类型(如:int , char , double等),都是采用按值传递的方式执行,除此之外的其他类型都是按照引用传递(传递的是一个对象的引用)的方式执行。对象在函数调用时和使用“=”赋值时都是引用传递。
Java中clone方法的作用是为了在现实编程中解决这样一个问题:
从某个已有的对象A创建出另外一个与A具有相同状态的对象B,并且对B的修改不会影响到对象A。
Java中所有的类都继承自Object类,该类中有一个clone方法,那么我们如何使用clone()方法呢?具体步骤如下:
1.实现clone的类,首先要继承Cloneable接口。Cloneable接口实质上是一个标志接口,没有任何接口方法;
2.在类中重写clone()方法;
3.在clone方法中调用super.clone();
4.把浅复制的引用指向原型对象新的克隆体;
对上面的例子,引入clone()方法如下:
package com.JinLing.demo1;
//浅复制例子
class Obj implements Cloneable{
private int aInt = 0;
public int getaInt() {
return aInt;
}
public void setaInt(int aInt) {
this.aInt = aInt;
}
public void changeInt(){
this.aInt = 1;
}
public Object clone(){
Object o = null;
try {
o = (Obj)super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return o;
}
}
public class Demo3 {
public static void main(String[] args) {
Obj a = new Obj();
Obj b = (Obj) a.clone();
b.changeInt();
System.out.println("a:"+a.getaInt());
System.out.println("b:"+b.getaInt());
}
}
程序执行的结果:
a:0
b:1
但是当类中包含了一些对象时,就需要用到深复制,实现方法是对对象调用clone()方法完成复制之后,接着对对象中的非基本数据类型也调用clone()方法完成深复制。eg:
//深复制的例子
class Obj implements Cloneable{
Date birth = new Date();
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public void changeDate(){
this.birth.setMonth(4);
}
public Object clone(){
Object o = null;
try {
o = (Obj)super.clone();
} catch (CloneNotSupportedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//实现深复制
birth = (Date)this.getBirth().clone();
return o;
}
}
public class Demo3 {
public static void main(String[] args) {
Obj a = new Obj();
Obj b = (Obj) a.clone();
b.changeDate();
System.out.println("a:"+a.getBirth());
System.out.println("b:"+b.getBirth());
}
}
运行结果为:
a:Sun Nov 13 10:05:14 CST 2016
b:Fri May 13 10:05:14 CST 2016
问:深复制和浅复制的区别?
答:浅复制是被复制对象的所有变量都含有与原来对象相同的值,而所有对其他对象的引用仍然指向原来的对象。
深复制是被复制对象的所有变量都含有与原来对象相同的值,那些引用变量将指向被复制的新对象,而不再是原有的那些被引用的对象。深复制是把复制的对象所引用的对象都复制了一边。