Java数组的本质

本文转载自https://blog.csdn.net/u013887236/article/details/50801477

1.数组是虚拟机自动创建的类型

int[] a1 = {1, 2, 3, 4};  
System.out.println(a1.getClass().getName());  
//打印出的数组类的名字为[I  

String[] s = new String[2];  
System.out.println(s.getClass().getName());  
//打印出的数组类的名字为  [Ljava.lang.String;  

String[][] ss = new String[2][3];  
System.out.println(ss.getClass().getName());  
//打印出的数组类的名字为    [[Ljava.lang.String;  

打印出a1的类型为[ I ,s 的类型是[Ljava.lang.String;  ,  ss的类型是[[Ljava.lang.String;  

所以,java数组也是有类型的。只是这个类型显得比较奇怪。你可以说a1的类型是int[],这也无可厚非。但是我们没有自己创建这个类,也没有在Java的标准库中找到这个类。也就是说不管是我们自己的代码,还是在JDK中,都没有如下定义:

public class int[] {  

// ...  

// ...  

// ...  
} 

这只能有一个解释,那就是虚拟机自动创建了数组类型,可以把数组类型和8种基本数据类型一样, 当做java的内建类型。


2.数组的继承关系

如下代码是正确的,却很容易让我们疑惑:
String[] s = new String[5];  
Object[] obja = s;   //成立,说明可以用Object[]的引用来接收String[]的对象  
  • 1
  • 2
  • 3
  • 4
Object[]类型的引用可以指向String[]类型的数组对象? 由上文的验证可以得知数组类型的顶层父类一定是Object,那么上面代码中s的直接父类是谁呢?难道说String[]继承自Object[],而Object[]又继承自Object? 让我们通过反射的方式来验证这个问题:        
//5     那么String[] 的直接父类是Object[] 还是 Object?  
System.out.println(s.getClass().getSuperclass().getName());  
//打印结果为java.lang.Object,说明String[] 的直接父类是 Object而不是Object[]  
由代码可知,String[]的直接父类就是Object而不是Object[]。可是Object[]的引用明明可以指向String[]类型的对象。那么他们的继承关系有


 这样的话就违背了Java单继承的原则。String[]不可能即继承Object,又继承Object[]。上面的类图肯定是错误的。那么只能这样解释:数组类直接继承了Object,关于Object[]类型的引用能够指向String[]类型的对象,这种情况只能是Java语法之中的一个特例,并不是严格意义上的继承。也就是说,String[]不继承自Object[],但是我可以允许你向上转型到Object[],这种特性是赋予你的一项特权。也就是说,父类数组可以指向子类数组。这一点在传递参数时可以简化代码

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值