public class Test {
/**
*
* @param args
* @throws CloneNotSupportedException
*/
public static void main(String[] args) throws CloneNotSupportedException {
// TODO Auto-generated method stub
testReference();
}
/**
* 测试引用传递
* @throws CloneNotSupportedException
*/
public static void testReference() throws CloneNotSupportedException {
Node node = new Node(10, 1);
Node a = node;
Node b = node;
System.out.println("this is a : " + a);
System.out.println("this is b : " + b);
a.data = 20;//修改
System.out.println("\nafter modification:\n");
//由于是引用传递,实际上只有a修改了,b也会跟着修改,因为a和b引用的是同一个对象
System.out.println("this is a : " + a);
System.out.println("this is b : " + b);
System.out.println("============== test clone ==============");
/**
* 需要注意的是,此时a和b不再引用同一个对象了
* a指向的是以node为模板,克隆出来的一个新的Node实例
* b指向的依然是原来的node
*/
a = (Node) node.clone();
b = node;
System.out.println("this is a : " + a);
System.out.println("this is b : " + b);
a.data = 30;//修改
System.out.println("\nafter modification:\n");
System.out.println("this is a : " + a);
System.out.println("this is b : " + b);
}
}
class Node implements Cloneable{
int data;
int no;
public Node(int data, int no) {
super();
this.data = data;
this.no = no;
}
@Override
public String toString() {
return "Node [data=" + data + ", no=" + no + "]";
}
@Override
public Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
Node node = new Node(data, no);
return node;
}
}打印结果如下:
this is a : Node [data=10, no=1] this is b : Node [data=10, no=1] after modification: this is a : Node [data=20, no=1] this is b : Node [data=20, no=1] /** 注意,此时虽然只修改了a.data,但是实际上b.data的值和a.data的值一起改变 因为a和b引用的是同一个对象 */ ============== test clone ============== /** a指向了克隆后的对象,b仍然指向原来的对象 */ this is a : Node [data=20, no=1] this is b : Node [data=20, no=1] after modification: /** 此时修改a和修改b已经无关了,因为a和b指向的不是同一个对象 因此a修改a.data=30时,并不会影响b.data */ this is a : Node [data=30, no=1] this is b : Node [data=20, no=1]

京公网安备 11010502036488号