数组类如何在Java中工作?
在Java中,array是一个类并扩展了Object。 我很想知道这个特殊的数组类。 我没有在任何地方找到类定义。 执行getClass()。getName()会得到奇怪的结果。
String[] array = new String[]{"one","two"}; System.out.println(array.getClass().getName()); // prints [Ljava.lang.String;
我想了解arrays是如何工作的。 数组类定义是否在JVM中进行了硬编码?
任何资源,书籍,链接都会对您有所帮助。
谢谢。
是的,基本上数组是VM密切关注的东西,比如原始类型。 有特定的字节码指令可以使用数组 – 创建它们,索引它们等。
至于资源以找到更多 – JVM规范可能是最好的起点。 第7.9节有一些使用数组的字节码示例。
关于数组类名
Class.getName
清楚地指定了这些“时髦”数组名称:
如果此类对象表示不是数组类型的引用类型,则返回类的二进制名称,如Java语言规范第二版所指定。
如果此类对象表示基本类型或void,则返回的名称是一个
String
等于与基本类型或void
相对应的Java语言关键字。如果此类对象表示一个数组类,则名称的内部forms由元素类型的名称组成,前面有一个或多个
'['
字符,表示数组嵌套的深度。 元素类型名称的编码如下:Element Type Encoding boolean Z byte B char C double D float F int I long J short S class or interface Lclassname;
关于数组类成员
JLS 10.7arrays成员
数组类型的成员是以下所有成员:
public final field length
,包含数组的组件数(长度可以是正数或零)public method clone
,它覆盖Object
类中相同名称的方法,并且不会抛出任何已检查的exception- 所有成员都inheritance自
class Object
; 唯一没有inheritance的Object
方法是它的clone
方法
相关问题
- java中的点长度 – 找到它的定义
是的,JVM中有一个合成Class
,表示每种可能类型的数组(如Integer[].class
)。 每种基本类型都有一个(如int[].class
)。 我不认为它有任何定义,如源文件,在任何地方。 他们表现得像预期的那样; Number[].class
可以从Integer[].class
Number[].class
中分配。
它没有特殊的方法,如果这是你的意思,也不是任何特殊的源文件。 我甚至认为数组类型所具有的length
字段也被认为是在该类中定义的,尽管我承认我没有检查; 这是VM特有的。
JLS 10.8对此进行了定义。
Java虚拟机规范在4.2节中解释了什么名称,如[Ljava.lang.String;
意思。 请参阅: 4.2完全限定类和接口名称的内部forms 。
在这种情况下, [
表示这是一个数组类型,并且Lclassname;
表示这是对classname类型的对象的引用数组。
所以[Ljava.lang.String;
表示String[]
。