为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

杨__羊羊 2019-03-21 18:14:15
该问题从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点不进去源码?
查看完整描述

3 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

1、Java中并不存在任何一个类对应数组,数组属于Java语言的一部分。
2、数据是特殊的对象,本身就实现了CloneableObjectclone方法的javadoc中有这么一句Note that all arrays are considered to implement the interface Cloneable ,所以数组是可以直接使用clone方法的。
3、数组对象天生就有一个finallength属性,因为数组并没有定义在任何一个类中,所以没有源码。

查看完整回答
反对 回复 2019-04-25
?
千万里不及你

TA贡献1784条经验 获得超9个赞

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

查看完整回答
反对 回复 2019-04-25
?
12345678_0001

TA贡献1802条经验 获得超5个赞

Class c = int[].class;
System.out.println(c.getPackage());
System.out.println(c.getName());
System.out.println(Modifier.toString(c.getModifiers()));

可以这么理解:
数组类是一组特殊的类,由JVM运行时动态生成,包括它的length属性及其它方法实现
除了int[], boolean[] 这种数组外,
还包含用户自定义类型的数组, 比如 com.yourPackage.YourClass[] 这种格式的数组,以及2维,3维..多维数组

有个有意思的输入结果
int[]类的修饰符是 public abstract final
这又超出了我们的认知


查看完整回答
反对 回复 2019-04-25
  • 3 回答
  • 0 关注
  • 677 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号