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

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

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

System.out.println(Children[].class.getSuperclass());

输出的结果却是:

class java.lang.Object

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

Ancestor[]Children[]的祖先类

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

这是为什么呢?

我们看一下getSuperclass()的API描述:

public Class<? super T> getSuperclass()

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

返回:

此对象所表示的类的超类。

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

java基础(十) 数组类型的更多相关文章

  1. Java基础之数组类型

    对于Java,前面的一些基础概念不是很想写,看了看还是从数组开始写吧(毕竟数组是第一个引用类型,相对复杂一点),我也是学了JAVA不是很久,目前看完了JAVA的基础视频,还有JAVA疯狂讲义这本书的大 ...

  2. 【转】Java基础笔记 – 枚举类型的使用介绍和静态导入--不错

    原文网址:http://www.itzhai.com/java-based-notes-introduction-and-use-of-an-enumeration-type-static-impor ...

  3. Java基础十二--多态是成员的特点

    Java基础十二--多态是成员的特点 一.特点 1,成员变量. 编译和运行都参考等号的左边. 覆盖只发生在函数上,和变量没关系. Fu f = new Zi();System.out.println( ...

  4. Java基础十--接口

    Java基础十--接口 一.接口的定义和实例 /* abstract class AbsDemo { abstract void show1(); abstract void show2(); } 8 ...

  5. Java基础之枚举类型Enum的使用

    Java基础之枚举类型Enum的使用 定义 public enum AccruedCleanEnum { SPREAD("1","发票"),OTHER(&quo ...

  6. java基础04-数据类型扩展及面试题

    java基础04-数据类型扩展及面试题讲解 public class demo02 { public static void main(String[] args){ // 一.整数拓展: 进制 二进 ...

  7. Java基础之 数组详解

    前言:Java内功心法之数组详解,看完这篇你向Java大神的路上又迈出了一步(有什么问题或者需要资料可以联系我的扣扣:734999078) 数组概念 同一种类型数据的集合.其实数组就是一个容器. 数组 ...

  8. Java基础之数组详解

    数组对于每一门编程语言来说都是重要的数据结构之一,当然不同语言对数组的实现及处理也不尽相同. Java 语言中提供的数组是用来存储固定大小的同类型元素. 你可以声明一个数组变量,如 numbers[1 ...

  9. Java基础之数组(一)

    数组的定义 数组是相同类型数据的有序集合.数组描述的是相同类型的若干个数据,按照 一定的先后次序排列组合而成.其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们.数组的三个基本特 ...

随机推荐

  1. 【jQuery源码】DOM Ready

    一直以来,各种JS最佳实践都会告诉我们,将JS放在HTML的最后,即</body>之前,理由就是:JS会阻塞下载,而且,在JS中很有可能有对DOM的操作,放在HTML的最后,可以尽可能的保 ...

  2. Oracle11g常用数据字典

    转:https://blog.csdn.net/fulq1234/article/details/79760698 Oracle数据字典的名称由前缀和后缀组成,使用_连接,含义说明如下: dba_:包 ...

  3. JPA主键生成策略

    @GeneratedValue: 为一个实体类生成一个唯一标识的主键(JPA要求每一个实体Entity,必须有且只有一个主键).它有两个属性,分别是strategy和generator. genera ...

  4. fail2ban的使用以及防暴力破解与邮件预警

    fail2ban可以监视你的系统日志,然后匹配日志的错误信息(正则式匹配)执行相应的屏蔽动作(一般情况下是防火墙),而且可以发送e-mail通知系统管理员! fail2ban运行机制:简单来说其功能就 ...

  5. ssh 登录进入 docker container

    1.Container安装ssh服务,博主的linux是centos ① 安装ssh sudo yum install openssh-server #安装ssh服务器 service sshd st ...

  6. 14-hadoop-运行的2种方式

    hadoop的程序运行有, 具体有3种, 除了上一篇(http://www.cnblogs.com/wenbronk/p/6662119.html)提过的直接发布jar上传到hadoop以外, 还有本 ...

  7. 面试:http协议

    转自:http://www.cnblogs.com/ranyonsue/p/5984001.html#undefined HTTP简介 HTTP协议是Hyper Text Transfer Proto ...

  8. SQL、Linq和Lambda表达式 的关系

    首先说说这三者完全是三种不同的东西,SQL是结构化查询语言(Structured Query Language)简称,这大家再熟悉不过了,下面主要介绍LINQ和Lambda表达式的基本概念以及同一查询 ...

  9. JavaScript 正则表达式RegExp 和字符串本身的正则表达式

    JavaScript 正则表达式 正则表达式(英语:Regular Expression,在代码中常简写为regex.regexp或RE)使用单个字符串来描述.匹配一系列符合某个句法规则的字符串搜索模 ...

  10. SpringMVC中数据转换

    SpringMVC中接收到的数据都是String形式,然后再根据反射机制将String转换成对应的类型.如果此时想接收一个Date类型,那么我们可以定义一个转换器来完成. 例如,我们有下面的Emp类: ...