数组类在Java中是如何工作的?
在Java中,数组是一个类,它扩展了对象。我很想知道这个特殊的数组类。我在任何地方都找不到类定义。执行getClass().getName()会产生奇怪的结果数组类在Java中是如何工作的?,java,arrays,jvm,Java,Arrays,Jvm,在Java中,数组是一个类,它扩展了对象。我很想知道这个特殊的数组类。我在任何地方都找不到类定义。执行getClass().getName()会产生奇怪的结果 String[] array = new String[]{"one","two"}; System.out.println(array.getClass().getName()); // prints [Ljava.lang.String; 我想了解阵列在引擎盖下是如何工作的。数组类定义是否在JVM中硬编码 任何关于这方面的资源、书籍
String[] array = new String[]{"one","two"};
System.out.println(array.getClass().getName()); // prints [Ljava.lang.String;
我想了解阵列在引擎盖下是如何工作的。数组类定义是否在JVM中硬编码
任何关于这方面的资源、书籍和链接都会很有帮助
谢谢。是的,基本上,数组是VM非常了解的东西,就像基本类型一样。有一些特定的字节码指令可用于处理数组——创建数组、索引数组等等
至于了解更多信息的资源,这可能是最好的起点。第7.9节有一些字节码处理数组的示例。是的,JVM中有一个合成的
类
,表示每种可能类型的数组(如Integer[].Class
)。每个基元类型也有一个(如int[].class
)。我不认为它是有定义的东西,就像源文件一样。他们的行为有点出乎意料<代码>数字[]。类可以从整数[]赋值。例如,类
它没有特殊的方法,如果你是这个意思的话,也没有特殊的源文件。我甚至不认为数组类型的length
字段被认为是在该类中定义的,尽管我承认我没有检查;这是VM的特例
定义它。Java虚拟机规范在第4.2节中解释了
[Ljava.lang.String;
等名称的含义。请参阅:
在这种情况下,[
表示这是一种数组类型,Lclassname;
表示这是对classname类型对象的引用数组
因此[Ljava.lang.String;
表示数组类名称的String[]
明确指定这些“时髦”数组名称:
如果该类对象表示的引用类型不是数组类型,则返回该类的二进制名称,如Java语言规范第二版所指定
如果该类对象表示基元类型或void,则返回的名称是一个字符串
,等于与基元类型或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;
关于数组类成员 数组类型的成员包括以下所有成员:
,其中包含数组的组件数(长度可以为正或零)公共最终字段长度
,它覆盖类公共方法克隆
中同名的方法,并且不抛出任何选中的异常对象
- 继承自
;未继承的类对象的所有成员
对象的唯一方法是其
方法克隆