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[]
答案 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
包中,并且您正在从其他包中访问它,这就是为什么会出现编译错误的原因。