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

ps:本文的实例和思想引用自<深入浅出jdk6.0>

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

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

  1. public   class  ValcpyDemo  
  2. {  
  3.     public  ValcpyDemo()  
  4.     {  
  5.         int  x =  0 ;  
  6.         int  y = x;  
  7.         x = 1 ;  
  8.         System.out.println("y = "  + y);  
  9.     }  
  10.   
  11.     public   static   void  main(String[] args)  
  12.     {  
  13.         new  ValcpyDemo();  
  14.     }  
  15.   
  16. }  
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 也就是说,对于基本类型的变量来说,通过简单赋值就可以实现值变量的拷贝 .

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

看下面的代码:

  1. public   class  ObjcpyDemo  
  2. {  
  3.     public  ObjcpyDemo()  
  4.     {  
  5.         // 定义student1对象变量   
  6.         Student student1 = new  Student();  
  7.         student1.id = "0001" ;  
  8.         student1.name = "Tom" ;  
  9.         // 将student1赋值给student2   
  10.         Student student2 = student1;  
  11.         student1.id = "0002" ;  
  12.         student1.name = "Jack" ;  
  13.   
  14.         System.out.println("student2.id = "  + student2.id);  
  15.         System.out.println("student2.name = "  + student2.name);  
  16.     }  
  17.   
  18.   
  19.     public   static   void  main(String[] args)  
  20.     {  
  21.         new  ObjcpyDemo();  
  22.     }  
  23.   
  24. }  
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的赋值更类似于基本类型.

下面是示例:

  1. public   class  StrcpyDemo  
  2. {  
  3.     public  StrcpyDemo()  
  4.     {  
  5.         String s1 = "1" ;  
  6.         String s2 = s1;  
  7.         s1 = "2" ;  
  8.         System.out.println("s2 = "  + s2);  
  9.     }  
  10.   
  11.     public   static   void  main(String[] args)  
  12.     {  
  13.         new  StrcpyDemo();  
  14.     }  
  15. }  
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的赋值更类似于基本类型.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值