zoukankan      html  css  js  c++  java
  • 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();

  • 相关阅读:
    第十七节--Hystrix服务熔断
    第十六节--Hystrix之服务降级全局配置
    第十五节--Hystrix之服务降级
    第十四节--Hystrix断路器
    第十三节--OpenFeign服务接口调用
    第十二节--Ribbon
    第十一节--三个注册中心对比
    uni-app开发小说阅读器
    H5+微信朋友、朋友圈分享
    uni-app开发音乐电子书库
  • 原文地址:https://www.cnblogs.com/qingyundian/p/8329927.html
Copyright © 2011-2022 走看看