Java中数组的讨论:它是一个类吗?

 2024-01-20 01:01:23  阅读 0

我读了一篇讨论数组的文章:以下是我自己的看法。

首先,我们需要区分类型和类。 我们可以肯定地说数组是一种类型,但它不是一个类。 类型是一个与编译器相关的概念,其抽象与面向对象无关。 类是面向对象中的一个概念。 他们不再处于同一水平线上。 int和byte都是类型,对应着相应的Class。 系统还提供相应的拳击课程。 但需要注意的是,它们的底层实现和操作是相同的,与面向对象无关。 我们可以将它们视为“内置对象”。 它们都是用C实现的,反射和Proxy也是如此。 因此,Class 可以从任何类型中获取,而不是从类中获取。 这个Class类本身的操作也是独一无二的。 从这个意义上说,类本身并不是一个纯粹的面向对象的类。 对此,我们可以说:看起来数组不是类。

从另一个角度来看,即使从内置函数来看,jdk也没有准备好将数组变成类。 一般来说,类(非内部的或最终的)是一个面向对象的实体,具有封装、继承和多态性的特点。 数组与集合类不同,不能被继承。 这是对其阶级身份产生怀疑的证据。 (.net似乎想妥协,提供一个Array类作为所有数组的父类。但是还是有点尴尬)。 但是A是B的父类,但是A[]和B[]是不正确的。 因此,我们也感觉数组不是一个类。

但在更深层次上,在虚拟机中,对数组和类的引用也是指向内存堆的指针。 处理过程与性能类似。

综上所述,从语法和实现上来说,数组与类不同。 在虚拟机规范和底层实现中,数组是类类对象。

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

PS:参考《Java虚拟机(五:The Java)》(网上看的,不知道在哪本书)

3.保存数组(Array)

在Java中,数组是一个完整的对象。 它像对象一样存储在堆中,并具有对 Class 类的实例的引用。 所有相同维度和类型的数组都有相同的Class,并且不考虑数组的长度。 与类相对应的名称被表示为维度和类型。 例如,整型数据的类名是“[I”,字节型三维数组的类名是“[[[B”,二维对象数据的类名是“[[” Ljava.lang。”。

多维数组表示为数组的数组,如下所示:

数组必须在堆中存储数组的长度、数组的数据以及对某些对象数组类型数据的引用。 通过数组引用,虚拟机应该能够获取数组的长度,通过索引访问特定数据,并调用定义的方法。 是所有数据类的直接父类。 有关详细信息,请参阅第 6 章“类文件”。

标签: 数组 对象 面向

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码