该问题从clone()方法开始引出。
clone()是基类Object类中的一个protected方法。
对该方法做以下测试
public class A implements Cloneable { public static void main(String[] args) throws CloneNotSupportedException { A a = new A(); // 调用正确 A a2 = (A) a.clone(); } }
以上调用成功,因为A是object的子类,继承了Object中的clone()方法,所以可以直接调用。
public class B { public static void main(String[] args) { A a = new A(); // 调用失败 a.clone(); } }
错误信息:
以上调用出错,A和B都是Object的子类,都继承了clone()方法,但不能在一个子类中调用另一个子类的protected方法。
如果需要在类B中实现对实例a的clone,类A需要重写clone方法,并且申明为public,如下:
类A:
public class A implements Cloneable { public Object clone() throws CloneNotSupportedException { return super.clone(); } }
类B:
public class B { public static void main(String[] args) throws CloneNotSupportedException { A a = new A(); // 调用成功 a.clone(); } }
以上调用成功,因为类A重写了clone方法,并且申明为public。
public class ArrayClone { public static void main(String[] args) { int[] array = {1, 1, 4, 7}; // 调用成功 array.clone(); } }
如果把array理解成为Object的子类,那么该array应该不能在类ArrayClone中调用clone()方法。但是可以调用成功。
此外:
章节1中,直接在类A中调用实例a的clone()方法时,IDE明确指出clone()方法是protected的,智能提示上有个小钥匙。
而在章节3中,调用数组的clone()方法时,IDE提示该方法是public的,智能提示上有个打开的锁。
1. Java中是否有一个类对应数组?数组在jvm中是一个怎样的存在?
2. 数组的clone()方法是怎么实现的?为什么可以直接调用?为什么是public的?
3. 数组的.length方法是怎么实现的?为什么IDE点不进去源码?
1、Java中并不存在任何一个类对应数组,数组属于Java语言的一部分。
2、数据是特殊的对象,本身就实现了
Cloneable
。Object
的clone
方法的javadoc中有这么一句Note that all arrays are considered to implement the interface Cloneable ,所以数组是可以直接使用clone
方法的。3、数组对象天生就有一个
final
的length
属性,因为数组并没有定义在任何一个类中,所以没有源码。一周热门 更多>