java培训班达内教育

更新时间:2023-01-02 21:43:29 阅读: 评论:0


2023年1月2日发(作者:波兰语你好)

关于java数组的深度思考【达内总部java培训】

刚刚开始接触java数组的人都会听到一句类似的话:java是纯面向对象的语言,他的数组也是一个对

象。于是乎,笔者就按照一个对象的方式来使用数组,心安理得。直到我接触到C的数组后,才发现将数

组作为一个类来使用在实现上是多么的“不自然”。

首先我们看一下表面现象,数组创建的时候采用的是如下语句:

MyClass[]arr=newMyClass[9];

而普通类采用的是如下语句:

MyClassobj=newMyClass();

就是说,创建数组的时候不使用小括号传参。使得数组和普通类看起来就有很多不同,因为小括号里

的参数是传递给构造方法的,进而让人感觉数组类是没有构造方法的。

再往深了想,还有很多让人感觉不自然的东西。可以肯定的是,java确实将数组作为了一个类来处理。

还是用上面的例子说明:

可以通过以下方法得到MyClass[]的Class实例:ss()或MyClass[].class。这样,我就可以向数

组类里面“窥探”了。

Classclazz=MyClass[].class;

n(structors().length);

打印出来的结果是0;证明数组类确实没有构造方法。

如果强行执行tance();就会得到下面的错误。

tiationException:[s;

证明数组类不能够通过普通的反射方式来创建一个实例。

再看看数组类的“庐山真面目”:

n(clazz);

输出是:

[s

对JavaClass文件结构稍有了结就知道,这个字符串的意思就是一个元素类型为s的一

维数组。也就是说,数组类型不是和普通类一样,以一个全限定路径名+类名来作为自己的唯一标示的,而

是以[+一个或者多个L+数组元素类全限定路径+类来最为唯一标示的。这个()也是数组和普通类的区别。而

这个区别似乎在某种程度上说明数组和普通java类在实现上有很大区别。因为java虚拟机(java指令集)在

处理数组类和普通类的时候,肯定会做出区分。笔者猜想,可能会有专门的java虚拟机指令来处理数组。

既然我们可以得到数组的Class类实例,就说明肯定需要调用ClassLoader的defineClass(不一定非要

是loadClass方法)方法,来构造一个Class实例。java虚拟机规范规定,任何一个可以被加载的类,如果其

类文件存储在文件系统上,那么一个*.class文件只能存储一个类信息,也就是说,数组类的信息不可能以

类文件的形式存储在本地磁盘上(否则任意一个类都要配有255个数组类了.....),既然这样,那就说明java

虚拟机肯定内置了一块用来声明数组类的数据(不管是几级数组)。这是符合java虚拟机规范的,规范规定

class类数据可以来自任意介质,包括本地磁盘、网络、数据库、内存等等。

分析到这里,我基本上可以肯定:java对数组对象化的操作的支持是指令级的,也就是说java虚拟机

有专门针对数组的指令。数组的Class类实例是java虚拟机动态创建动态加载的,其结构与普通java类的

Class实例有一些不同。

JDKAPI中有一个类,这个类提供了很多方法(绝大多数是native方法,这在另

一个方面证明了java对数组的支持是专用指令支持的,否则用本地方法干嘛^_^),用来弥补我们对数组操

作的局限性。

下面这句话用来创建一个一维的、长度为10的、类型为s的数组:

s[]arr=(s[])tance(s,10);

下面这句话用来创建一个二维的、3乘5的、类型为s的数组:

int[]arrModel=newint[]{3,5};

ObjectarrObj=tance(,arrModel);

当然你可以用一个数组的引用指向上面的二维数组,这里我们用一个Object的引用指向他。

使用的时候,我们也是可以利用Array类提供的方法来实现:

n(gth(arrObj);//第一维长度为3

n(gth((arrObj,2)));//第二维长度为5,这里如果写3,就会得到你意

想之中的ndexOutOfBoundsException

打印结果是如我们所想的:

3

5

对于数组的Class类实例,还有一些奇怪的现象:

在运行代码ieldarr=ld("length");的时候,会抛出异常:

FieldException:length,这似乎在说数组类没有length这个域,而这个域其实是我们用的最

多的一个(也就是说这个域是肯定存在的)。笔者认为关于数组的Class类实例、数组的实现等,还有很多“猫

腻”在里面。

顺便说一句,java数组最多只能是255维的。这个让人看到了C的影子,嘿嘿。“Java把数组当作一个

java类来处理”说起来容易,用起来自然,但是细细想来,还是有很多不简单的地方。

本文发布于:2023-01-02 21:43:29,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/90/80149.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图