为什么我遇到“clone() has protected access in java.lang.Object”编译器错误?

Chp*_*ead 0 java syntax

对象的克隆方法是受保护的,因此可以在子类(A 类)中访问它,那么为什么我会收到“clone() has protected access in java.lang.Object”编译器错误?我认为所有 Java 类都是 Object 的子类。提前致谢。

下面的代码会引发编译器错误:

public class A {
    public static void main(String[] args) {
        Object o = new Object();
        o.clone();//error
    }
}
Run Code Online (Sandbox Code Playgroud)

但是这个编译完美,它们不是有相同的语义吗?

public class A {
    protected void foo() {

    }
}
Run Code Online (Sandbox Code Playgroud)
public class B extends A {
    public static void main(String[] args) {
        A a = new A();
        a.foo();
    }
}
Run Code Online (Sandbox Code Playgroud)

rzw*_*oot 5

不,他们没有。

protected意味着件事:

  • 就像package,_这解释了为什么你的第二个片段可以调用foo(). B这并不是关于extends的事实A,而是A在于它与B.
  • 子类只能在其自身上调用它。简单地说(但如果是的话,这不起作用final),您可以简单地覆盖它,将其实现为return super.clone();,现在您可以很好地调用它。