注册
 找回密码
 注册
江西广告网
查看: 308|回复: 0
打印 上一主题 下一主题

Java中三种变量的拷贝方法比较

[复制链接]

该用户从未签到

1
跳转到指定楼层
发表于 2009-2-12 09:00:35 | 只看该作者 回帖奖励 |正序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
变量复制不是通过复制就可以实现的吗?这可是最基本的编程常识,为什么还要专门来阐述呢? 首先我们来看一下值类型怎么复制,看下面的代码: public class ValcpyDemo { public ValcpyDemo() { int x = 0; int y = x; x = 1; System.out.println("y = " y); } public static void main(String[] args) { new ValcpyDemo(); } } public class ValcpyDemo { public ValcpyDemo() { int x = 0; int y = x; x = 1; System.out.println("y = " y); } public static void main(String[] args) { new ValcpyDemo(); } } 结果显而易见:y的值为0 也就是说,对于基本类型的变量来说,通过简单赋值就可以实现值变量的拷贝. 但是对于对象类型来说,情况却不那么简单. 看下面的代码: 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(); } } [1] [2] 结果是: student2.id = 0002 student2.name = jack 对象变量student2从student1赋值得到,而且在student1值发生改变的同时, student2对象的属性值也相应的改变了,看起来student1和student2指向的是同一个对象(即同一块内存),根本没有达到复制的目的. 这是为什么呢?原来对象类型 变量的复制,不能和简单类型变量一般,而必须引用Object.Clone()方法,否则赋予的 只是对象的引用而已. 而直接或者间接的使用Object.Clone()方法,来实现Clone的对象也有"浅层克隆"和"深层克隆"的说法,将在另一片文章中描述. 那么,让我们最后看一下字符串的拷贝又是怎么一回事呢? 虽然String类型也是继承自Object,但对于字符串来说,情况显得有点特殊.对于String类型的赋值是创建一个新的String对象,而不仅仅是将对象 引用赋值给对方.从这个意义上讲,对String的赋值更类似于基本类型. 下面是示例: public class StrcpyDemo { public StrcpyDemo() { String s1 = "1"; String s2 = s1; s1 = "2"; System.out.println("s2 = " s2); } public static void main(String[] args) { new StrcpyDemo(); } } public class StrcpyDemo { public StrcpyDemo() { String s1 = "1"; String s2 = s1; s1 = "2"; System.out.println("s2 = " s2); } public static void main(String[] args) { new StrcpyDemo(); } } 答案: s2 = 1 总结: 对于基本类型,通过简单赋值就可以实现值变量的拷贝. 对象类型 变量的复制,不能和简单类型变量一般,而必须引用Object.Clone()方法,否则赋予的 只是对象的引用而已. 对于String类型的赋值是创建一个新的String对象,而不仅仅是将对象 引用赋值给对方.从这个意义上讲,对String的赋值更类似于基本类型. 上一页 [1] [2]
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表