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

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

每日一题

❶  在Servlet处理请求的方式为:   CA.以进程的方式B.以程序的方式C.以线程的方式D.以响应的方式

❷多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么?

多线程有两种实现方法,分别是继承Thread类与实现Runnable接口 同步的实现方面有两种,分别是synchronized,wait与notify

❸ 写一个Singleton(单例模式)出来。

public class LazySingleton {

private static LazySingleton instance = null;

 

// 默认的私有的构造方法,保证外界无法直接实例化

private LazySingleton() {

}

 

// 静态方法,返回此类的唯一实例

public  static LazySingleton getInstance() {

if (instance == null) {

instance = new LazySingleton();

}

return instance;

}

public void pp(){

System.out.println(“lazy ok”);

}

}

✎✎如果小伙伴们有更好的回答,欢迎在留言区留言哦,我们一起努力营造更好的学习氛围。

作者:jinggod出处:http://www.cnblogs.com/jinggod/p/8428062.html

回复以下关键字获取更多学习资源****

``

java基础|html5|css|js|jquery|angularJs|ajax|node.js|javaEE基础| |struts2|hibernate|spring|svn|maven|springmvc|mybatis|linux|oracle| |luncene|solr|redis|springboot|架构师资源|dubbo|php|webservice|c++基础|nginx|mysql|sqlserver|asp.net更多学习资源逐步更新,请置顶公众号不要错过更新

好好学java

每日推送java优质文章、视频教程、热点资讯

微信ID:SIHAI0911

长按左侧二维码关注

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

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

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

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


 上一篇
java面试题大合集(开发者必看一) java面试题大合集(开发者必看一)
前言本文来自百度网络的一篇文章,由于没有答案,现在整理了一些比较好的回答和好的博客,可以自己扩展思路,如果大家有一下面试题的更好的答案,欢迎在评论区留言。以上全部来自网络!此外,我的微信公众号将每日分享下面面试题相关的知识点总结干货,欢迎关
2021-04-04
下一篇 
JDK 10 的 109 项新特性 JDK 10 的 109 项新特性
戳上面的蓝字关注我们哦!  精彩内容    来源:开源中国, www.oschina.net/translate/109-new-features-in-jdk-10 虽然感觉 JDK9 发布才仅仅几周的时间,然而,随着新
2021-04-04