Java中的数组有对应的类么,为什么数组可以直接调用clone()方法? 财富值71

2016-10-21 15:53发布

该问题从clone()方法开始引出。

clone()是基类Object类中的一个protected方法。

对该方法做以下测试

1. 在类A中调用类A实例a的clone()方法

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()方法,所以可以直接调用。

2. 在类B中调用类A实例a的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。

3. 提出问题,数组为什么可以直接调用clone()方法

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的,智能提示上有个打开的锁。


4. 提问

1. Java中是否有一个类对应数组?数组在jvm中是一个怎样的存在?
2. 数组的clone()方法是怎么实现的?为什么可以直接调用?为什么是public的?
3. 数组的.length方法是怎么实现的?为什么IDE点不进去源码?

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
5条回答

Java的数组就是数组,没有类与之对应。
数组所使用的clone()并非一定要类才能拥有呀,只要编译器提供了这种语法,一样可以实现。
同样的,数组的length也是编译器解析出来的数组属性,并非由Java实现,也自然看不到Java的源码。

一周热门 更多>