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