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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM