zoukankan      html  css  js  c++  java
  • Java 深浅拷贝

    1、浅拷贝(同一个引用):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

    2、深拷贝(新引用):被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量。那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象。换言之,深复制把要复制的对象所引用的对象都复制了一遍。

    3、浅拷贝:

    class Student {  
        private int number;  
      
        public int getNumber() {  
            return number;  
        }  
      
        public void setNumber(int number) {  
            this.number = number;  
        }  
          
    }  
    public class Test {  
          
        public static void main(String args[]) {  
              
            Student stu1 = new Student();  
            stu1.setNumber(12345);  
            Student stu2 = stu1;  
              
            System.out.println("学生1:" + stu1.getNumber());  
            System.out.println("学生2:" + stu2.getNumber());  
        }  
    }  
    

    4、深拷贝:

      实现方式:

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

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

      Java的clone()方法

      ⑴clone方法将对象复制了一份并返回给调用者。一般而言,clone()方法满足:
        ①对任何的对象x,都有x.clone() !=x//克隆对象与原对象不是同一个对象
        ②对任何的对象x,都有x.clone().getClass()= =x.getClass()//克隆对象与原对象的类型一样
        ③如果对象x的equals()方法定义恰当,那么x.clone().equals(x)应该成立。

      ⑵Java中对象的克隆
        ①为了获取对象的一份拷贝,我们可以利用Object类的clone()方法。 
        ②在派生类中覆盖基类的clone()方法,并声明为public。 
        ③在派生类的clone()方法中,调用super.clone()。 
        ④在派生类中实现Cloneable接口。

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

    5、Java示例:

    public Object clone() {  
        Date d = null;  
        try {  
            d = (Date)super.clone();  
            if (cdate != null) {  
                d.cdate = (BaseCalendar.Date) cdate.clone();  
            }  
        } catch (CloneNotSupportedException e) {} // Won't happen  
        return d;  
    }  
    工作小总结,有错请指出,谢谢。
  • 相关阅读:
    设置为自动启动的WindowService没有开机启动
    Asp.Net部署问题
    MSDTC的折磨
    C# WinForm 边框阴影窗体
    升级DotNetNuke
    常用缩写
    DotNetNuke的升级路径
    日本語文法勉強
    PostSubmitter~在WEB应用程序以外的其他程序里提交Web请求的类
    vue中的锚链接跳转问题
  • 原文地址:https://www.cnblogs.com/zilanghuo/p/6677167.html
Copyright © 2011-2022 走看看