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

  • 相关阅读:
    uni-app 苹果内购支付及获取苹果支付成功信息
    nginx强制使用https访问(http跳转到https)
    最新IOS审核被拒原因TOP10 | 附带解决方法
    ethercat PREEMPT SMP
    client-go workqueue
    k8s apiserver 重启失败
    cni flannel iptables -t filter -D FORWARD -j REJECT --reject-with icmp-host-prohibited
    nginx configmap
    golang yaml LoadYAML
    not found: manifest unknown: manifest unknown
  • 原文地址:https://www.cnblogs.com/qingyundian/p/8329927.html
Copyright © 2020-2023  润新知