为什么在浅拷贝或深拷贝中需要覆盖clone()。为了相同的目的,我们不能编写任何方法(方法名称)

时间:2017-10-04 20:05:26

标签: java deep-copy cloning shallow-copy

我真的不明白使用重写clone()。如果是浅层和深层克隆,我们可以编写任何方法名称,它可以达到目的。我们也不使用父类(Object) )引用调用克隆方法。然后使用重写请解释。

浅拷贝

global _start
_start:
    mov   rsi,   rsp
    mov   eax,   0xdeadbeef
    mov   [rsi], eax
    mov  dword [rsi+4], 0xbadf00d

     ;;; memory is set up                              
firstbreak:
    mov   [rsi], fs        ; 8c 26   16-bit store
    ;mov  dword [rsi], fs   ; not encodeable (even in 32-bit mode)
    mov  qword [rsi], fs   ; 48 8c 24 24   YASM chokes, NASM assembles REX.W 8c 26.  Still a 16-bit store!!!

    mov    ax, fs       ; 66 8c e0  only modifies AX, leaving upper bits
    mov   eax, fs       ;    8c e0  zeros whole rax
    mov   rax, fs       ;    8c e0  zeros whole rax   (YASM: 48 8c e0)
    mov   r10d, fs      ; 41 8c e2  (rex.w=0)
    mov   r10, fs       ; 49 8c e2  (rex.w=1)

    xor ebx,ebx
    mov eax,1
    int 0x80     ; sys_exit(0)   (32-bit ABI so you can more easily assemble this as 32-bit code)

深层复制

    class Person implements Cloneable {
    private String name;

    protected Object copy() {//method name is copy
        try {
            return super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
            return null;
        }
    }

    public void setName(String name) {
        this.name = name;
    }

}

public class TestClone {

    public static void main(String[] args) {
        Person ob1 = new Person();
        ob1.setName("Bibhu");
        Person ob2 = (Person) ob1.copy();
        System.out.println(ob1.getClass() == ob2.getClass());//true
    }

}

1 个答案:

答案 0 :(得分:0)

它仅适用于惯例。甚至JavaDoc也是如此:

  

按照惯例,实现此接口的类应该重写   使用公共方法的Object.clone(受保护)。看到   Object.clone()有关重写此方法的详细信息。