为什么Array上允许克隆方法?

时间:2012-08-23 06:43:31

标签: java clone

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

    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[] 

5 个答案:

答案 0 :(得分:6)

所有阵列都实现了Cloneable接口。

请参阅Java语言规范的相关部分:§10.7 Array Members

  

公共方法clone,它覆盖类Object中的同名方法,并且不会抛出任何已检查的异常。数组类型clone的{​​{1}}方法的返回类型为T[]。   多维数组的克隆很浅,也就是说它只创建一个新数组。子阵列是共享的。

答案 1 :(得分:0)

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

另一方面,任意对象都不能保证它可以为自己制作一个逐字段的副本。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

该类还具有受保护的Object.clone()方法的具体和公共实现。 Java允许方法的访问级别( public,private,protected和默认的受包保护的访问级别)在重写该方法时限制性较小。换句话说,受保护的方法可以在子类中公开,这就是JVM对数组类实现的protected clone()方法所做的事情。

答案 4 :(得分:-1)

这是因为clone()Object类的保护,并且受保护的访问说明符表示您可以访问同一包的子类中的超类protected方法。出于这种原因,Object类位于java.lang包中,并且您正在从其他包中访问它,这就是为什么会出现编译错误的原因。