public class ObjcpyDemo
{
public ObjcpyDemo()
{
// 定义student1对象变量
Student student1 = new Student();
student1.id = "0001";
student1.name = "Tom";
// 将student1赋值给student2
Student student2 = student1;
student1.id = "0002";
student1.name = "Jack";
System.out.println("student2.id = " + student2.id);
System.out.println("student2.name = " + student2.name);
}
public static void main(String[] args)
{
new ObjcpyDemo();
}
}
public class ObjcpyDemo
{
public ObjcpyDemo()
{
// 定义student1对象变量
Student student1 = new Student();
student1.id = "0001";
student1.name = "Tom";
// 将student1赋值给student2
Student student2 = student1;
student1.id = "0002";
student1.name = "Jack";
System.out.println("student2.id = " + student2.id);
System.out.println("student2.name = " + student2.name);
}
public static void main(String[] args)
{
new ObjcpyDemo();
}
}
结果是:
student2.id = 0002
student2.name = jack
对象变量student2从student1赋值得到,而且在student1值发生改变的同时, student2对象的属性值也相应的改变了,看起来student1和student2指向的是同一个对象(即同一块内存),根本没有达到复制的目的.
这是为什么呢?原来对象类型 变量的复制,不能和简单类型变量一般,而必须引用Object.Clone()方法,否则赋予的 只是对象的引用而已. 而直接或者间接的使用Object.Clone()方法,来实现Clone的对象也有"浅层克隆"和"深层克隆"的说法,将在另一片文章中描述.
那么,让我们最后看一下字符串的拷贝又是怎么一回事呢?
虽然String类型也是继承自Object,但对于字符串来说,情况显得有点特殊.对于String类型的赋值是创建一个新的String对象,而不仅仅是将对象 引用赋值给对方.从这个意义上讲,对String的赋值更类似于基本类型.
下面是示例: