-1

我正在阅读Java 中的协变返回类型。我写了以下代码:

一个父类:

package other;

public class Super implements Cloneable {

    @Override
    public Super clone() throws CloneNotSupportedException {
        return (Super) super.clone();
    }

}

一个子类:

package other;

public class Sub extends Super {

    @Override
    public Sub clone() throws CloneNotSupportedException {
        return (Sub) super.clone();
    }
}

我如何使用它:

package com.sample;

import other.Sub;
import other.Super;

public class Main {

    public static void main(String[] args) throws Exception {
        Super aSuper = new Super();
        Super bSuper = aSuper.clone();
        System.out.println(aSuper == bSuper); // false

        Sub aSub = new Sub();
        Sub bSub = aSub.clone();
        System.out.println(aSub == bSub); // false
    }
}

如果在覆盖方法时可以返回子类型(如您所见,这就是我对clone()inSuper和所做的事情Sub),为什么我分别在运行and时看到Object.cloneinSuper和?Subjavap -p Super.classjavap -p Sub.class

结果javap -p Super.class

Compiled from "Super.java"
public class other.Super implements java.lang.Cloneable {
  public other.Super();
  public other.Super clone() throws java.lang.CloneNotSupportedException;
  public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
}

结果javap -p Sub.class

Compiled from "Sub.java"
public class other.Sub extends other.Super {
  public other.Sub();
  public other.Sub clone() throws java.lang.CloneNotSupportedException;
  public other.Super clone() throws java.lang.CloneNotSupportedException;
  public java.lang.Object clone() throws java.lang.CloneNotSupportedException;
} 
4

1 回答 1

0

clone 方法属于类Object我们可以重写这个方法。但是为了调用这个方法,Java 运行时要求我们指出这个类将使用 clone 方法克隆它的对象,该方法会生成该类实例的逐个字段副本。

该指示是使用标记接口完成的Cloneable(标记接口没有方法,它们仅用于向编译器和 JVM 指示特定事物)。

在您正在调用的类 Super clone() 方法中,super.clone() 这只不过是调用 Object.clone() 方法,因为 Object 是 Super 的直接超类。

这就解释了为什么你java.lang.Object clone()在使用时看到javap

欲了解更多信息,请阅读

可克隆参考

于 2017-05-11T05:46:51.920 回答