java基础面试题:写clone()方法时,通常都有一行代码,是什么?

clone()方法 与new constructor()构造器创建对象不同 是克隆一个新的对象

package com.swift;

public class Clone_Test {

    public static void main(String[] args) {
        Person p = new Person(23, "zhang");
        Person p1 = p;
        
        System.out.println(p);
        System.out.println(p1);
    }

}

class Person{
    private int age;
    private String name;
    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

Person p1=p; 这个不是对象的克隆 是引用的复制 因为p p1的地址相同

克隆的方法

实现Cloneable接口 覆写clone()方法 克隆要先克隆父类 所以要super.clone();

package com.swift;

public class Clone_Test {

    public static void main(String[] args) throws CloneNotSupportedException {
        Person p = new Person(23, "zhang");
        Person p1 = (Person) p.clone();
        
        System.out.println(p);
        System.out.println(p1);
    }
}

class Person implements Cloneable{
    private int age;
    private String name;
    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

这是克隆的p1和p的内存地址已经不同

如果要克隆的对象中还包含其他对象

则克隆后的对象是 浅拷贝 的而不是 深拷贝 的 克隆前后对象中的对象都是同一个对象

如果要深拷贝则要在clone() 方法中把对象中的对象也进行克隆

class Body implements Cloneable{  
    public Head head;  
    public Body() {}  
    public Body(Head head) {this.head = head;}  
  
    @Override  
    protected Object clone() throws CloneNotSupportedException {  
        Body newBody =  (Body) super.clone();  //克隆了body
        newBody.head = (Head) head.clone();   //深入克隆newBody中的对象
        return newBody;  
    }  
      
}  

完全的深拷贝是不可能的,如果head还有face face还有eye,如果不一只深克隆下去就无法实现完全的深克隆

所以面试题通常都有的一句是super.clone();

posted @ 2018-01-22 16:57  Advancing-Swift  阅读(4679)  评论(0编辑  收藏  举报