vickerdogan 2021-10-04 16:01 采纳率: 100%
浏览 39
已结题

深拷贝和浅拷贝问题 如何在cardriver类没有cloneable情况下在car类写出深拷贝

cardriver为car子类

在Java中 有一个方法为protected Object clone() throws CloneNotSupportedException,这个方法就是进行的浅拷贝。某个类要实现深拷贝 这个类需要实现Cloneable接口,然后对clone方法进行重写

CarDriver为已定义好的类,main函数也写好,如下

class CarDriver {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public CarDriver() {}
    public String toString() {
        return "CarDriver [name=" + name+"]";
    }
}
public class Main {
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int i=sc.nextInt();
        switch(i) {
        case 1:     //深拷贝
            CarDriver cd=new CarDriver();
            Car c1=new Car();
            c1.setDriver(cd);
            cd.setName("d1");
            c1.setName("car1");
            int[] s=new int[2];
            c1.setScores(s);
            Car d1=(Car)c1.clone();
            System.out.println("c1:"+(c1==d1)+" driver:"+(c1.getDriver()==d1.getDriver())+" scores:"+(c1.getScores()==d1.getScores()));
            System.out.println(c1.toString()+" "+d1.getName()+" "+d1.getDriver().getName());    
            break;
        case 2: //        
            Car c2=new Car();
            Car d2=(Car)c2.clone();
            System.out.println("c2:"+(c2==d2)+" driver:"+c2.getDriver()+" "+(c2.getDriver()==d2.getDriver())+" scores:"+c2.getScores()+" "+(c2.getScores()==d2.getScores()));
            break;
        case 3:
            CarDriver cd1=new CarDriver();
            Car c3=new Car();
            c3.setDriver(cd1);
            Car d3=(Car)c3.clone();
            System.out.println("c3:"+(c3==d3)+" driver:"+c3.getDriver()+" "+(c3.getDriver()==d3.getDriver())+" scores:"+c3.getScores()+" "+(c3.getScores()==d3.getScores()));
            break;
        case 4:
            //CarDriver cd3=new CarDriver();
            Car c4=new Car();
            //c4.setDriver(cd3);
            int[] s1=new int[2];
            c4.setScores(s1);
            Car d4=(Car)c4.clone();
            System.out.println("c4:"+(c4==d4)+" driver:"+c4.getDriver()+" "+(c4.getDriver()==d4.getDriver())+" scores:"+" "+(c4.getScores()==d4.getScores()));
            break;

        } 
    }
}

以下是自己写的car的代码:


class Car implements Cloneable{  //定义一个Car类 实现接口Cloneable
    private String name;//成员变量定义
    private CarDriver driver;
    private int[] scores;
    public Car() { }
    public Object clone() {  //重写clone方法
        Car c =null;
        try {
            c = (Car)super.clone(); //调用父类Object实现浅拷贝
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return c;
    }

    public String getName(){

        return name;
    }

    public CarDriver getDriver() {
        return driver;
    }

    public int[] getScores(){

        return scores;
    }
    public void setName(String name){

        this.name=name;
    }

    public void setDriver(CarDriver driver) {
        this.driver = driver;
    }

    public void setScores(int[] scores) {
        this.scores = scores;
    }
    @Override
    public String toString() {
        return "Car [name=" + name + ", driver=" + driver + ", scores=" + Arrays.toString(scores) + "]";
    }
}
  • 写回答

3条回答 默认 最新

查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月5日
  • 已采纳回答 3月28日
  • 创建了问题 10月4日

悬赏问题

  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度