P: java分基本数据类型和引用数据类型。
(1)假克隆: 对于 = 等于号的克隆形式, 基本数据类型是值拷贝.相当于把值copy一份了。而引用数据类型是把内存中的地址指向了当前引用,也就是两个引用变量将指向同一个对象。因此,如果一个变量对其进行修改则会改变另一个变量。
(2)浅克隆: 在克隆对象时,如果对象的成员变量时基本类型,则使用浅拷贝。如果包含了引用类型,则需要深拷贝(当然也可以使用浅拷贝)。
浅拷贝: 是指拷贝对象时仅仅拷贝对象本身(包括对象中的基本变量),而不拷贝对象包含的引用指向的对象。
深拷贝: 不仅拷贝对象本身,而且拷贝对象包含的引用指向的所有对象。
举例来说更加清楚:对象A1中包含对B1的引用,B1中包含对C1的引用。浅拷贝A1得到A2,A2 中依然包含对B1的引用,B1中依然包含对C1的引用。
深拷贝则是对浅拷贝的递归,深拷贝A1得到A2,A2中包含对B2(B1的copy)的引用,B2 中包含对C2(C1的copy)的引用。
如果遇到引用类型时使用浅拷贝,相当于是假克隆了
(3)深克隆: 如上所述,类的成员变量包括可变引用类型,则使用深克隆。
例子:
public class Demo13 { public static void main(String[] args) {
qw qw = new qw();
te t = new te(6, qw);
te t2 = t.clone();
te t3 = t;
System.out.println(t2 == t); //false
System.out.println(t3 == t); } } // true
System.out.println( t.toString()); //打印对象的地址值
System.out.println( t2.toString());
System.out.println( t3.toString());
class te implements Cloneable {
private int s;
private qw q;
public te(int s, qw q) { this.q = q; this.s = s; }
public te clone() {
te t = null;
try { t = (te) super.clone(); t.q = q.clone(); } catch (Exception e) { } return t; } }
class qw implements Cloneable {
public qw clone() {
qw qw = null;
try { qw = (qw) super.clone(); } catch (CloneNotSupportedException e) { } return qw; } }通过判断是否相等以及查看地址值可知:
不使用clone()的时候, 变量的引用指向同一个对象。








网友评论