V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
proxytoworld
V2EX  ›  Java

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

  •  
  •   proxytoworld · Nov 15, 2020 · 2261 views
    This topic created in 1988 days ago, the information mentioned may be changed or developed.

    在 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 replies    2020-11-16 09:54:22 +08:00
    xuanbg
        1
    xuanbg  
       Nov 15, 2020
    因为 clone()返回的对象实际上是 Person 类型,所以才能用(Person)强转。不过这个玩意没啥用,只是个浅拷贝而已。深拷贝的话一般情况下用序列化+反序列化即可。除非是大规模的对象复制,没必要用别的高效方法。
    AllanAG
        2
    AllanAG  
       Nov 16, 2020
    因为使用了协变返回,object 默认 clone()方法返回 object 对象,可以直接返回子类(协变返回类型)
    协变返回值类型:在子类中重写方法时可以用“较窄”类型替换的类型
    在 Java1.4 及以前,子类方法如果要覆盖超类的某个方法,必须具有完全相同的方法签名,包括返回值也必须完全一样。
    Java5.0 放宽了这一限制,只要子类方法与超类方法具有相同的方法签名,或者子类方法的返回值是超类方法的子类型,就可以覆盖。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4672 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 10:07 · PVG 18:07 · LAX 03:07 · JFK 06:07
    ♥ Do have faith in what you're doing.