早泻 发表于 2009-2-6 09:34:54

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

变量复制不是通过复制就可以实现的吗?这可是最基本的编程常识,为什么还要专门来阐述呢?
    首先我们来看一下值类型怎么复制,看下面的代码:

    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();
      }
    }

   
   
                  
   结果是:
   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]
查看完整版本: Java中三种变量的拷贝方法比较