java数组

java中所有的引用类型,都属于类,既然都属于类,那么父类就都是Object,数组类也不例外,在java中,数组也是一种引用类型,即是一种类。不过这种类没有java代码,所以看不到底层实现,因为底层是C语言实现的,java只是使用而已,众所周知,java是用C语言开发出来的。所以有很多很多C的特性,海域大量的本地方法,都是通过C语言实现的,通过链接文件引用C语言方法(.dll)

代码

public static void main(String[] args) {
    Class c = int[].class; 
    Class cIn = Integer[].class;
    Class ccIn = Integer[][].class;
    System.out.println(c.getName());
    System.out.println(cIn.getName());
    System.out.println(ccIn.getName());
    Class f = float[].class;
    Class flo = Float[].class;
    System.out.println(f.getName());
    System.out.println(flo.getName());
}

输出的结果:

[I
[Ljava.lang.Integer;
[[Ljava.lang.Integer;
[F
[Ljava.lang.Float;

上面的输出结果就是通过Class的toString()方法输出的内容,可以看出规律,“[”表示一维数组,“[[”则表示二维数组,如此类推下去。同时,如果是引用类型,则还要“[”后面还要跟一个”L“+类的全限定名。而如果是基本类型,则只要跟对应的大写字母。

数组类的分类

数组类大致可以分为两类,一种是基本类型数组类,一种是引用类型数组类,数组类是在JDK中是有分类的:对于一维的基本类型数组,输出”[“,而对于一维的引用数组则输出 ”[L“,多了一个”L“。

数组类可以分类可以分成两类:

基本类型的数组类;
引用类型的数组类;
这两种数组类的区别是:
基本类型的数组类只有一个父类,也就是Object类
引用类型的数组类有两个最上层父类,一个是Object类,还有一个是Object[]类(Object数组类)

基本类型的数组类

public static void main(String[] args) {
    int[] a = new int[3];
    Object o = a;//编译通过,类型转换成功;
    //打印一下数组的超类
    System.out.println("int[]的superClass是: "+int[].class.getSuperclass());
    
}

运行结果:

int[]的superClass是: class java.lang.Object

引用类型的数组类
  对于引用类型的数组类,其所有的祖先类除了Object类外,还包括下面所说的类:
如果A是B的祖先类,A[]也是B[]的祖先类,其他维度也如此类推,不同维度间,没有任何关系。

代码:

public class Test_3 {
   
public static void main(String[] args) {
    Children[] childrens = new Children[3];
    Ancestor[] ancestors = childrens; //编译通过,类型上转成功
    // 判断childrens 是不是 Ancestor或者是其子类的实例,进一步证明 Children[] 是  Ancestor[]的子孙类
    System.out.println("childrens instanceof Ancestor[] : " + (childrens instanceof Ancestor[]));
}   
}


class Ancestor{//祖先类
    
}

class Parent extends Ancestor{//父类,继承于Ancestor
    
}

class Children extends Parent{//子类,继承于Parent
    
}

运行结果:

childrens instanceof Ancestor[] : true

上面的例子中,因为Ancestor是Children的祖先类,所以Ancestor[]也是Children[]的祖先类。

如果这时候我们调用执行下面的代码:

System.out.println(Children[].class.getSuperclass());
输出的结果却是:

class java.lang.Object

原因
为什么引用类型数组Children[]的父类是Object类,那么与上面所说的

Ancestor[]是Children[]的祖先类

起了冲突。因为如果父类是Object,Object类是根类了,那么祖先类就只有一个,就不可能再有其他的祖先类

这是为什么呢?

我们看一下getSuperclass()的API描述或者看getSuperclass()的底层实现原理:

public Class<? super T> getSuperclass()
返回表示此 Class 所表示的实体(类、接口、基本类型或 void)的超类的 Class。如果此 Class 表示 Object 类、一个接口、一个基本类型或 void,则返回 null。如果此对象表示一个数组类,则返回表示该 Object 类的 Class 对象。
返回:
此对象所表示的类的超类。

原来,getSuperclass对于调用者是数组类的对象的话,那么直接返回Object类的class对象。