zoukankan      html  css  js  c++  java
  • java 克隆对象(转)

    来源:http://www.cnblogs.com/Qian123/p/5710533.html

    一般步骤是(浅克隆):

    1. 被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSupportedException异常), 该接口为标记接口(不含任何方法)

    2. 覆盖clone()方法,访问修饰符设为public方法中调用super.clone()方法得到需要的复制对象。(native为本地方法)

    下面对上面那个方法进行改造:

    class Student implements Cloneable{  
        private int number;  
      
        public int getNumber() {  
            return number;  
        }  
      
        public void setNumber(int number) {  
            this.number = number;  
        }  
          
        @Override  
        public Object clone() {  
            Student stu = null;  
            try{  
                stu = (Student)super.clone();  
            }catch(CloneNotSupportedException e) {  
                e.printStackTrace();  
            }  
            return stu;  
        }  
    }  
    public class Test {  
        public static void main(String args[]) {  
            Student stu1 = new Student();  
            stu1.setNumber(12345);  
            Student stu2 = (Student)stu1.clone();  
              
            System.out.println("学生1:" + stu1.getNumber());  
            System.out.println("学生2:" + stu2.getNumber());  
              
            stu2.setNumber(54321);  
          
            System.out.println("学生1:" + stu1.getNumber());  
            System.out.println("学生2:" + stu2.getNumber());  
        }  
    }  

    结果是:

      

    结果:

    学生1:12345  

    学生2:12345  

    学生1:12345  

    学生2:54321

    深度复制:

    我们在学生类里再加一个Address类。

       

    
    
     package abc;  
     2   
     3 class Address implements Cloneable {  
     4     private String add;  
     5   
     6     public String getAdd() {  
     7         return add;  
     8     }  
     9   
    10     public void setAdd(String add) {  
    11         this.add = add;  
    12     }  
    13       
    14     @Override  
    15     public Object clone() {  
    16         Address addr = null;  
    17         try{  
    18             addr = (Address)super.clone();  
    19         }catch(CloneNotSupportedException e) {  
    20             e.printStackTrace();  
    21         }  
    22         return addr;  
    23     }  
    24 }  
    25   
    26 class Student implements Cloneable{  
    27     private int number;  
    28   
    29     private Address addr;  
    30       
    31     public Address getAddr() {  
    32         return addr;  
    33     }  
    34   
    35     public void setAddr(Address addr) {  
    36         this.addr = addr;  
    37     }  
    38   
    39     public int getNumber() {  
    40         return number;  
    41     }  
    42   
    43     public void setNumber(int number) {  
    44         this.number = number;  
    45     }  
    46       
    47     @Override  
    48     public Object clone() {  
    49         Student stu = null;  
    50         try{  
    51             stu = (Student)super.clone();   //浅复制  
    52         }catch(CloneNotSupportedException e) {  
    53             e.printStackTrace();  
    54         }  
    55         stu.addr = (Address)addr.clone();   //深度复制  
    56         return stu;  
    57     }  
    58 }  
    59 public class Test {  
    60       
    61     public static void main(String args[]) {  
    62           
    63         Address addr = new Address();  
    64         addr.setAdd("杭州市");  
    65         Student stu1 = new Student();  
    66         stu1.setNumber(123);  
    67         stu1.setAddr(addr);  
    68           
    69         Student stu2 = (Student)stu1.clone();  
    70           
    71         System.out.println("学生1:" + stu1.getNumber() + ",地址:" + stu1.getAddr().getAdd());  
    72         System.out.println("学生2:" + stu2.getNumber() + ",地址:" + stu2.getAddr().getAdd());  
    73           
    74         addr.setAdd("西湖区");  
    75           
    76         System.out.println("学生1:" + stu1.getNumber() + ",地址:" + stu1.getAddr().getAdd());  
    77         System.out.println("学生2:" + stu2.getNumber() + ",地址:" + stu2.getAddr().getAdd());  
    78     }  
    79 }  
    
    

    输出结果:

      学生1:123,地址:杭州市

      学生2:123,地址:杭州市

      学生1:123,地址:西湖区

      学生2:123,地址:杭州市

  • 相关阅读:
    按键精灵-3-按键精灵键盘鼠标命令
    Python-13-pass,del和exec
    STP-9-处理RSTP中的拓扑变化
    Python-12-简单推导
    Python-11-循环
    Python-10-条件和条件语句
    Qt qml listview 列表视图控件(下拉刷新、上拉分页、滚动轴)
    Qt qml pageview 左右滑动分页组件
    Qt qml treeview 树控件
    Qt qml 模拟iphone slide to unlock 的聚光动画文字效果
  • 原文地址:https://www.cnblogs.com/Zchaowu/p/7512018.html
Copyright © 2011-2022 走看看