A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 上篮高手 中级黑马   /  2013-10-18 19:52  /  1131 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 上篮高手 于 2013-10-18 19:54 编辑

假克隆:
      对于基本类型可以使用 = 来进行克隆,此时两个变量除了相等没有任何关系,

      但对于引用类型却不能简单的使用 = 进行克隆,这主要是于 java的内存空间使用有关。

       通常情况很少使用 = 来操作对象,也很少使用 == 来比较两个对象。


      定义一个Employee类: 如下
  1. package com.mingrisoft.oop;

  2. public class Employee {
  3.     private String name;
  4.     private int age;
  5.    
  6.     public String getName() {
  7.         return name;
  8.     }
  9.    
  10.     public void setName(String name) {
  11.         this.name = name;
  12.     }
  13.    
  14.     public int getAge() {
  15.         return age;
  16.     }
  17.    
  18.     public void setAge(int age) {
  19.         this.age = age;
  20.     }
  21.    
  22.     @Override
  23.     public String toString() {
  24.         return "姓名:" + name + ", 年龄:" + age;
  25.     }
  26. }
复制代码
以下是main函数:
  1. package com.mingrisoft.oop;

  2. public class Test {
  3.     public static void main(String[] args) {
  4.         System.out.println("克隆之前:");
  5.         Employee employee1 = new Employee();
  6.         employee1.setName("java1");
  7.         employee1.setAge(12);
  8.         System.out.println("员工1的信息:");
  9.         System.out.println(employee1);
  10.         
  11.         
  12.         
  13.         System.out.println("克隆之后:");
  14.         Employee employee2 = employee1;
  15.         employee2.setName("web1");
  16.         employee2.setAge(34);
  17.         System.out.println("员工2的信息:");
  18.         System.out.println(employee2);
  19.         
  20.         System.out.println("员工1的信息:");
  21.         System.out.println(employee1);
  22.     }
  23. }
复制代码
打印信息如下:
  1. 克隆之前:
  2. 员工1的信息:
  3. 姓名:java1, 年龄:12
  4. 克隆之后:
  5. 员工2的信息:
  6. 姓名:web1, 年龄:34
  7. 员工1的信息:
  8. 姓名:web1, 年龄:34
复制代码
当修改Employee2 的时候  employmee1 的内容也被修改了。并没有达到克隆目的。




浅克隆如下:
  1. package com.mingrisoft.oop;

  2. <font color="#ff0000">public class Employee implements Cloneable {</font>
  3.     private String name;
  4.     private int age;
  5.     private Address address; <font color="#ff0000">  //此变量是一个自定义里变量。</font>
  6.    
  7.     public Employee(String name, int age, Address address) {
  8.         this.name = name;
  9.         this.age = age;
  10.         this.address = address;
  11.     }
  12.    
  13.     public String getName() {
  14.         return name;
  15.     }
  16.    
  17.     public void setName(String name) {
  18.         this.name = name;
  19.     }
  20.    
  21.     public int getAge() {
  22.         return age;
  23.     }
  24.    
  25.     public void setAge(int age) {
  26.         this.age = age;
  27.     }
  28.    
  29.     public Address getAddress() {
  30.         return address;
  31.     }
  32.    
  33.     public void setAddress(Address address) {
  34.         this.address = address;
  35.     }
  36.    
  37.     @Override
  38.     public String toString() {
  39.         StringBuilder sb = new StringBuilder();
  40.         sb.append("姓名:" + name + ", ");
  41.         sb.append("年龄:" + age + "\n");
  42.         sb.append("地址:" + address);
  43.         return sb.toString();
  44.     }
  45.    
  46. <font color="#ff0000">    @Override
  47.     public Employee clone() {
  48.         Employee employee = null;
  49.         try {
  50.             employee = (Employee) super.clone();
  51.         } catch (CloneNotSupportedException e) {
  52.             e.printStackTrace();
  53.         }
  54.         return employee;
  55.     }</font>
  56. }
复制代码
main函数如下:
  1. package com.mingrisoft.oop;

  2. public class Test {
  3.     public static void main(String[] args) {
  4.         System.out.println("克隆之前:");
  5.         Address address = new Address("河北", "邯郸", "丛台");
  6.         Employee employee1 = new Employee("占二", 12, address);
  7.         System.out.println("员工1的信息:");
  8.         System.out.println(employee1);
  9.         
  10.         
  11.         System.out.println("克隆之后:");
  12.         Employee employee2 = employee1.clone();
  13.         employee2.getAddress().setState("中国");
  14.         employee2.getAddress().setProvince("云南");
  15.         employee2.getAddress().setCity("昆明");
  16.         employee2.setName("国美");
  17.         employee2.setAge(114);
  18.         
  19.         System.out.println("员工2的信息:");
  20.         System.out.println(employee2);
  21.         System.out.println("员工1的信息:");
  22.         System.out.println(employee1);
  23.     }
  24. }
复制代码
打印信息如下:
  1. 克隆之前:
  2. 员工1的信息:
  3. 姓名:占二, 年龄:12
  4. 地址:国家:河北, 省:邯郸, 市:丛台
  5. 克隆之后:
  6. 员工2的信息:
  7. 姓名:国美, 年龄:114
  8. 地址:国家:中国, 省:云南, 市:昆明
  9. 员工1的信息:
  10. 姓名:占二, 年龄:12
  11. 地址:国家:中国, 省:云南, 市:昆明
复制代码
分析可见 : 占二的姓名和年龄不没有被修改,但是地址信息被更改了。 因为 String  int  都可以实现值拷贝

                      有于自定义Address 类没有实现 Cloneable  接口所以,不能实现克隆,而是指向了同一个对象。






深克隆如下:
  1. package com.mingrisoft.oop;

  2. <font color="#ff0000">public class Address implements Cloneable {</font>
  3.     private String state;
  4.     private String province;
  5.     private String city;
  6.    
  7.     public Address(String state, String province, String city) {
  8.         this.state = state;
  9.         this.province = province;
  10.         this.city = city;
  11.     }
  12.    
  13.     public String getState() {
  14.         return state;
  15.     }
  16.    
  17.     public void setState(String state) {
  18.         this.state = state;
  19.     }
  20.    
  21.     public String getProvince() {
  22.         return province;
  23.     }
  24.    
  25.     public void setProvince(String province) {
  26.         this.province = province;
  27.     }
  28.    
  29.     public String getCity() {
  30.         return city;
  31.     }
  32.    
  33.     public void setCity(String city) {
  34.         this.city = city;
  35.     }
  36.    
  37.     @Override
  38.     public String toString() {
  39.         StringBuilder sb = new StringBuilder();
  40.         sb.append("国家:" + state + ", ");
  41.         sb.append("省:" + province + ", ");
  42.         sb.append("市:" + city);
  43.         return sb.toString();
  44.     }
  45.    
  46. <font color="#ff0000">    @Override
  47.     protected Address clone() {
  48.         Address address = null;
  49.         try {
  50.             address = (Address) super.clone();
  51.         } catch (CloneNotSupportedException e) {
  52.             e.printStackTrace();
  53.         }
  54.         return address;
  55.     }</font>
  56. }
复制代码
  1. package com.mingrisoft.oop;

  2. <font color="#ff0000">public class Employee implements Cloneable {</font>
  3.     private String name;
  4.     private int age;
  5.     private Address address;
  6.    
  7.     public Employee(String name, int age, Address address) {
  8.         this.name = name;
  9.         this.age = age;
  10.         this.address = address;
  11.     }
  12.    
  13.     public String getName() {
  14.         return name;
  15.     }
  16.    
  17.     public void setName(String name) {
  18.         this.name = name;
  19.     }
  20.    
  21.     public int getAge() {
  22.         return age;
  23.     }
  24.    
  25.     public void setAge(int age) {
  26.         this.age = age;
  27.     }
  28.    
  29.     public Address getAddress() {
  30.         return address;
  31.     }
  32.    
  33.     public void setAddress(Address address) {
  34.         this.address = address;
  35.     }
  36.    
  37.     @Override
  38.     public String toString() {
  39.         StringBuilder sb = new StringBuilder();
  40.         sb.append("姓名:" + name + ", ");
  41.         sb.append("年龄:" + age + "\n");
  42.         sb.append("地址:" + address);
  43.         return sb.toString();
  44.     }
  45.    
  46. <font color="#ff0000">    @Override
  47.     public Employee clone() {
  48.         Employee employee = null;
  49.         try {
  50.             employee = (Employee) super.clone();</font>
  51. <font color="#9acd32">            employee.address = address.clone();</font>
  52. <font color="#ff0000">        } catch (CloneNotSupportedException e) {
  53.             e.printStackTrace();
  54.         }
  55.         return employee;
  56.     }</font>
  57. }
复制代码
打印信息如下:
克隆之前:
员工1的信息:
姓名:占二, 年龄:12
地址:国家:河北, 省:邯郸, 市:丛台

克隆之后:

员工2的信息:
姓名:国美, 年龄:114
地址:国家:中国, 省:云南, 市:昆明

员工1的信息:
姓名:占二, 年龄:12
地址:国家:河北, 省:邯郸, 市:丛台



占二的信息并没有被更改,从而实现了深克隆。

评分

参与人数 1技术分 +1 收起 理由
李江 + 1 很给力!

查看全部评分

4 个回复

倒序浏览
请问克隆有什么好处,它和我直接再new一个新的员工出来有什么区别吗?
回复 使用道具 举报
我能学编程吗 发表于 2013-10-18 20:11
请问克隆有什么好处,它和我直接再new一个新的员工出来有什么区别吗?

克隆可以实现信息的复用,不用再重新进行大片的设置了,
所以得看情况了,我的理解
回复 使用道具 举报
我能学编程吗 发表于 2013-10-18 20:11
请问克隆有什么好处,它和我直接再new一个新的员工出来有什么区别吗?

克隆可以实现信息的复用,不用再重新进行大片的设置了,
所以得看情况了,我的理解
回复 使用道具 举报
上篮高手 发表于 2013-10-18 21:46
克隆可以实现信息的复用,不用再重新进行大片的设置了,
所以得看情况了,我的理解 ...

也就是说当一些对象拥有一些或很多相同的属性的时候比较实用。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马