java基础(十) 数组类型

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> java基础(十) 数组类型

1. 数组类简介

  在java中,数组也是一种引用类型,即是一种类。

我们来看一个例子,理解一下数组类:


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“+类的全限定名。而如果是基本类型,则只要跟对应的大写字母。

2. 数组类的分类

从上面的例子的输出可以看出,数组类是在JDK中是有分类的:对于一维的基本类型数组,输出”[“,而对于一维的引用数组则输出 ”[L“,多了一个”L“。

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

  • 基本类型的数组类;- 引用类型的数组类;
    这两种数组类的最大区别在于他们的祖先类不同。

2.1 基本类型的数组类

   对于基本类型来说,基本类型数组类的父类一个,就是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

2.2 引用类型的数组类

  对于引用类型的数组类,其所有的祖先类除了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描述:

public Class

原文地址:https://sihai.blog.csdn.net/article/details/79434272

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> java基础(十) 数组类型


 上一篇
java基础(八) 深入解析常量池与装拆箱机制 java基础(八) 深入解析常量池与装拆箱机制
引言  本文将介绍常量池 与 装箱拆箱机制,之所以将两者合在一起介绍,是因为网上不少文章在谈到常量池时,将包装类的缓存机制,java常量池,不加区别地混在一起讨论,更有甚者完全将这两者视为一个整体,给初学者带来不少困扰,我就是过来的。同时,
2021-04-04
下一篇 
java基础(十一) 枚举类型 java基础(十一) 枚举类型
枚举类型Enum的简介1.什么是枚举类型枚举类型: 就是由一组具有名的值的有限集合组成新的类型。(即新的类)。 好像还是不懂,别急,咱们先来看一下 为什么要引入枚举类型 在没有引入枚举类型前,当我们想要维护一组 常量集合时,我们是这样做的,
2021-04-04