【刨根问底】之特殊的对象——数组(java中数组的本质)

1. java数组的本质

//动态初始化
Integer[] array = new Integer[5];
int i = 5;
Integer[] array = new Integer[i];
//静态初始化
Integer[] array = {1,2,3};

众所周知,java的数组是对象,虽然十分基础,但是不少朋友工作一段时间甚至会忘记这东西如何实例化,这其实非常简单因为这玩意诡异的申明方式

//申明数组
Integer[] array = new Integer[5];
//申明普通对象
String str = new String("你构造方法呢???");

一般来说,new后跟的都是构造方法或者某个可以提供实例的方法,但是我们在创建数组时,并没有调用数组的构造方法或者别的提供实例的方法——毕竟方法的本质是消息的发送,而消息的发送的标志是方法名+(),我们并没有看到这样的字样
那么我们换一个思路——这个构造方法应该存放于我们申明的这个对象的类之中,那么我们应该找到这个名为Integer[]的类型,而实际上,该种类型无法找到,或者说根本就并不存在
也就是说,不管是我们自己的代码,还是在JDK中,都没有如下定义:

class Integer[]{
...
}

那么有这种特征的类型在java中其实十分明显了,那就是基础数据类型,再加上在JDK8规范中野十分明显的声明:“数组并没有外部的字节码文件,不会由类加载器加载,而是由jvm自己生成的”
也就是说,数组的类型和其他的八种基础数据类型一样,由JVM内建,自然不需要申明构造方法

1.1数组内的继承关系

String [] s = new String[5];
Object [] ob = s;

在数组之间同样存在多态,以上代码可以通过,我们可以理解为是否Object []String []的父类呢?
那么,为了确证

System.out.print(s.getClass().getSuperClass().getName());
System.out.print(ob.getClass().getSuperClass().getName());
//输出结果都是Object

那么再由于Java的单继承特性,String[]和Object[]类之间不应该有继承关系
根据我查到的资料,认为这种赋值是一种特权,而我觉得,这种所谓的特权其实和int类型的值可以赋值给long类型一样,是一种类似于精确度的特性

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值