zoukankan      html  css  js  c++  java
  • 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

      上面的例子中,因为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对象。



  • 相关阅读:
    URL中传参带有%2F等特殊字符
    js根据对象数组中某一属性值,合并相同项,并对某一属性累加处理
    windows传输文件到linux
    npm 切换源
    linux下安装java
    PowerShell:因为在此系统上禁止运行脚本,解决方法
    wget: 未找到命令
    发货通知单禁止手工新增
    固定提前期
    容差码
  • 原文地址:https://www.cnblogs.com/jinggod/p/8428062.html
Copyright © 2011-2022 走看看