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();
}
}
结果显而易见: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();
}
}
结果是:
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();
}
}
答案:
s2 = 1
总结:
对于基本类型,通过简单赋值就可以实现值变量的拷贝
.
对象类型 变量的复制,不能和简单类型变量一般,而必须引用Object.Clone()方法,否则赋予的 只是对象的引用而已.
对于String类型的赋值是创建一个新的String对象,而不仅仅是将对象 引用赋值给对方.从这个意义上讲,对String的赋值更类似于基本类型.
变量复制不是通过复制就可以实现的吗?这可是最基本的编程常识,为什么还要专门来阐述呢?
首先我们来看一下值类型怎么复制,看下面的代码:
view plain
copy to clipboard
?
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
?
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
?
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的赋值更类似于基本类型.
相关文章推荐
- Java中三种方法拼接字符串时间比较
- Java 判断字符串是否为空的三种方法性能比较
- java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- java中使用字符串或者动态创建对象的三种方法(Class,Constructor,Proxy)
- 【JAVA学习】java中==、equals()、hashCode()都和对象的比较有关,在java中这三者各有什么用处呢,即java中为什么需要设计这三种对象的比较方法呢?
- java java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- java java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- java java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- java java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- Java生成Boolean对象的三种方法之比较
- java java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- java java中subString、split、stringTokenizer三种截取字符串方法的性能比较
- Java 中String对象比较方法equals和等号==
- java中判断字符串是否为数字的三种方法
- 判断Java空字符串三种方法的比较
- 比较Java Swing中三种注册事件的方法
- java 写文件的三种方法比较