java中数组的讨论:是不是类?

来源:互联网 发布:正大数据恢复中心 编辑:程序博客网 时间:2024/05/29 17:27

看了一篇讨论数组的文章:<关于java数组的深度思考>.以下是我自己的一点看法。

首先,要区分类型和类。我们可以很肯定的说数组是一种类型,但是它绝不是类。类型是编译器相关的概念,其抽象性跟面向对象无关。类是面向对象中的一个概念。他们不再同一个级别。int,byte都是类型,都对应相对的Class,系统也提供了对应的装箱类。但是要注意的是,对于他们的底层实现和操作都是native的,跟面向对象无关,我们可以认为是“内置对象”,他们是用c来实现的,反射和Proxy也是这样的。所以可以取到Class的是任何类型,而不是类,这个Class类的本身的操作也都是native的,从这个意义上Object类本身也不是一个纯面向对象意义的类。在这个方面,我们可以说:看起来数组不是一个类。

从另一个角度来说,即使在内置的功能上,jdk也没有准备让数组成为一个类,通常意义上类(非内部或final)是面向对象的实体,有封装,继承,多态的特性。数组不同于集合类,无法继承,这个是对他的类的身份怀疑的一个证据。(.net似乎想折中,提供了一个Array类作为所有数组的父类。但是还是有些别扭)。但是A是B的父类,但是A[]和B[]却不能正确的CastClass。所以,我们也觉得数组不是一个类。

但是更深入一层来说,在虚拟机中,数组和类的引用同样是一块内存堆的指针。处理方式和表现方式很像。

总结,在语法和实现方式上,数组不像一个类。在虚拟机规范和底层实现,数组是一个像类的对象。

-----------------------------------------------------------------------------------------

PS:参考了“Java虚拟机(Chapter Five: The Java Virtual Machine) (网上看的,不知道什么书里的)

3、数组的保存(Array Representation)
在Java 中,数组是一种完全意义上的对象,他和对象一样保存在堆中、有一个指向Class类实例的引用。所有同一维度和类型的数组拥有同样的Class,数组的长 度不做考虑。对应Class的名字表示为维度和类型。比如一个整型数据的Class为“[I”,字节型三维数组Class名为“[[[B”,两维对象数据 Class名为“[[Ljava.lang.Object”。
多维数组被表示为数组的数组,如下图: 
     数组必须在堆中保存数组的长度,数组的数据和一些对象数组类型数据的引用。通过一个数组引用的,虚拟机应该能够取得一个数组的长度,通过索引能够访问特定 的数据,能够调用Object定义的方法。Object是所有数据类的直接父类。更多信息参见第六章“类文件”。

 

 




原创粉丝点击