您的位置:首页 > 编程语言 > Java开发

Java中三种变量的拷贝方法比较: 值变量,对象变量,字符串变量

2009-12-13 18:37 651 查看
ps:本文的实例和思想引用自<深入浅出jdk6.0>

变量复制不是通过复制就可以实现的吗?这可是最基本的编程常识,为什么还要专门来阐述呢?

首先我们来看一下值类型怎么复制,看下面的代码:

view plain
copy to clipboard
print
?

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 也就是说,对于基本类型的变量来说,通过简单赋值就可以实现值变量的拷贝
.

但是对于对象类型来说,情况却不那么简单.

看下面的代码:

view plain
copy to clipboard
print
?

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的赋值更类似于基本类型.

下面是示例:

view plain
copy to clipboard
print
?

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的赋值更类似于基本类型.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐