当前位置: 首页>移动开发>正文

java克隆sheet页 java如何实现克隆

对象克隆

Object类中定义一个clone方法

native方法用于声明一个非java语言实现的代码,供java程序调用。因为java语言程序是运行在JVM上, 如果要访问比较底层的与操作系统相关的方法就没有办法了,只能通过比较靠近系统的语言来实现,比 如C/C++。

Object a=new Object();
Object b=a; //变量b中存储的是变量a的引用值,a和b指向的是同一个对象
Object a=new Object();
Object b=a.clone(); //b是a的克隆对象,具有a对象当前所有状态,但是b和a不是同一个对象

Java中有两种不同的克隆方法:浅克隆(shallowClone)和深克隆(deepclone)。浅克隆不支持引用类型成员 变量的复制,仅仅只是克隆的地址;深克隆支持引用类型成员变量的复制

浅克隆

1、被复制的类需要实现Cloneable接口,该接口也是旗标接口,不包含任何方法

2、在当前类种覆盖定义clone方法,将访问限定词设置为public。具体实现调用super.clone实现

浅克隆只会克隆引用类型属性的地址,并不是完整克隆引用类型属性。将会出现源对象和克隆对象的该属性指向同一个对象属性。在浅克隆种当对象被复制时他本身和其中包含的值类型的成员属性,而引用类型的成员对象并没有复制

public class Teacher implements Cloneable{
    private String name;
    private int age;
 
    public Teacher(String name, int age){
        this.name = name;
        this.age = age;
    }
    // 覆盖
    @Override
    public Object clone() {
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public int getAge() {
        return age;
    }
 
    public void setAge(int age) {
        this.age = age;
    }
}
// 客户端测试
public class test {
    Teacher origin = new Teacher("tony", 11);
    System.out.println(origin.getName());
    Teacher clone = (Teacher) origin.clone();
    clone.setName("clone");
    System.out.println(origin.getName());
    System.out.println(clone.getName());
}
深克隆

在深克隆种无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象。这里的区别于浅克隆,对于原型对象的所有引用类型的属性对象也复制一份给克隆对象,不是地址复制。

在java中实现深克隆有2种方案:可以覆盖Object的clone方法实现;也可以通过序列化实现。一般都是采用序列化的方式实现,注意实现序列化的前提是序列化接口

类定义需要实现序列化接口,当然为保证引用类型属性也能序列化,所以引用类型属性也必须实现序列化接口。



https://www.xamrdz.com/mobile/4gs1963354.html

相关文章: