V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
proxytoworld
V2EX  ›  Java

Java 新手关于 Java 中 Object 类的 Clone 方法

  •  
  •   proxytoworld · 2020-11-15 21:46:46 +08:00 · 1654 次点击
    这是一个创建于 1255 天前的主题,其中的信息可能已经有所发展或是发生改变。

    在 Object.java 中 clone 方法是这样声明的

    protected native Object clone() throws CloneNotSupportedException;
    

    protected 修饰符的方法子类应该可以继承,但是为什么子类使用 clone 方法必须得自己重写 clone 方法

    @Override
    protected Object clone() throws CloneNotSupportedException{
        return (Person) super.clone();
    }
    

    重写的方法是 super.clone,即使用 Object 的 clone 方法,这个方法返回 Object 类,但是为什么又使用(Person)强制转换了,按道理的话应该是返回 Object 类不能转换为 Person 类

    Person 类

    public class Person implements Cloneable{
    private int age;
    private String name;
    public Person(int age, String name){
        this.age = age;
        this.name = name;
    }
    public Person(){}
    
    public int getAge() {
        return age;
    }
    
    public String getName() {
        return name;
    }
    @Override
    protected Object clone() throws CloneNotSupportedException{
        return (Person) super.clone();
    }
    
    2 条回复    2020-11-16 09:54:22 +08:00
    xuanbg
        1
    xuanbg  
       2020-11-15 22:36:11 +08:00
    因为 clone()返回的对象实际上是 Person 类型,所以才能用(Person)强转。不过这个玩意没啥用,只是个浅拷贝而已。深拷贝的话一般情况下用序列化+反序列化即可。除非是大规模的对象复制,没必要用别的高效方法。
    AllanAG
        2
    AllanAG  
       2020-11-16 09:54:22 +08:00
    因为使用了协变返回,object 默认 clone()方法返回 object 对象,可以直接返回子类(协变返回类型)
    协变返回值类型:在子类中重写方法时可以用“较窄”类型替换的类型
    在 Java1.4 及以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名,包括返回值也必须完全一样。
    Java5.0 放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5251 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 09:18 · PVG 17:18 · LAX 02:18 · JFK 05:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.