2

clone()默认情况下,该方法在类中不可见,Object那么它如何不会为 Array 类型提供错误?
这是否意味着有一种称为 int[] 的类型,其实现是用 java 编写的,如果是,在哪里可以找到它?
如果它是写的,那为什么不完整地写呢?
我的意思是为什么不正确地实现每个方法,而不仅仅是ObjectClass 的行为。

    int[] a ={1,2,3};
    Object object = new Object();
    object.clone();//Does not compile since clone is protected.
    a.clone();// allowed as this method is from int[] 
4

5 回答 5

6

所有数组都实现了 Cloneable 接口。

请参阅 Java 语言规范的相关部分:§10.7 数组成员

public 方法clone,覆盖类中同名的方法,Object不抛出检查异常。clone数组类型的方法的返回类型T[]T[]。多维数组的克隆是浅的,也就是说它只创建一个新数组。子数组是共享的。

于 2012-08-23T06:49:25.837 回答
0

数组被 JVM 实现为动态创建的类的实例。该类有一个特殊的名称,它实现了上面其他海报所指出的 Cloneable 和 Serializable 接口。(它还有一个名为长度的公共最终字段......)。

该类还具有受保护的 Object.clone() 方法的具体和公共实现。Java 允许方法的访问级别(公共、私有、受保护和默认的包保护访问级别)在该方法被覆盖时限制较少。换句话说,受保护的方法可以在子类中公开,这就是 JVM 对数组类实现的受保护的 clone() 方法所做的。

于 2013-02-04T09:44:04.417 回答
0

因为数组不能作为普通对象扩展。制作数组的唯一方法Cloneable是从一开始就实现Cloneable接口。出于同样的原因,数组默认实现Serializable

于 2012-08-23T07:08:02.603 回答
0

这是因为有一个 Cloneable 接口使它可以Object.clone()访问该方法。Java 中的数组已经实现了 Cloneable,因此您可以克隆一个数组对象。

另一方面,任意对象不能保证它可以对自身进行逐个字段的复制。

于 2012-08-23T06:49:35.657 回答
-1

因为clone()Object类中受保护,并且受保护的访问说明符表示您可以访问同一个包的子类中的超类受保护方法。通过这种推理,Object类在java.lang包中,并且您正在从不同的包中访问它,这就是您收到编译错误的原因。

于 2019-11-21T14:33:11.210 回答