在Java中,数组是一个类并扩展对象。我很想知道这个特殊的数组类。我哪里都找不到类的定义。执行getClass().getName()会产生奇怪的结果。
String[] array = new String[]{"one","two"};
System.out.println(array.getClass().getName()); // prints [Ljava.lang.String;我想了解数组是如何在引擎盖下工作的。JVM中是否硬编码了数组类定义?
任何有关这方面的资源、书籍、链接都是有帮助的。
谢谢。
发布于 2010-05-26 07:12:27
是的,基本上,数组是VM非常熟悉的东西,就像原始类型一样。有特定的字节码指令来处理数组--创建它们、索引到它们中等等。
至于寻找更多资源的问题,JVM规范可能是最好的起点。第7.9节有一些字节码处理数组的示例。
发布于 2010-05-26 07:46:06
关于数组类名
Class.getName清楚地指定了这些“时髦”数组名称:
如果该类对象表示非数组类型的引用类型,则返回类的二进制名称,正如Java语言规范第二版所指定的那样。 如果这个类对象表示原始类型或空白,那么返回的名称是一个
String,等于对应于原语类型或void的Java关键字。 如果该类对象表示数组的类,则名称的内部形式由元素类型的名称组成,前面有一个或多个'['字符,表示数组嵌套的深度。元素类型名称的编码如下: 元素类型编码,布尔,Z,字节,B,C,双D浮点数,F,int,I,长J,短S类或接口Lclassname;
数组类成员
JLS 10.7数组成员
数组类型的成员如下:
public final field length,它包含数组的组件数(长度可以是正数或零)public method clone,它在类Object中重写同名的方法,并且不引发检查的异常。class Object继承的所有成员;唯一没有继承的Object方法是它的clone方法。相关问题
发布于 2010-05-26 07:23:50
是的,JVM中有一个合成的Class,表示每个可能类型的数组(比如Integer[].class)。每个基元类型也有一个(如int[].class)。我不认为它有定义,像源文件,任何地方。它们的行为有点像预期的那样;例如,Number[].class可以从Integer[].class分配。
它没有特殊的方法,如果这是您的意思,也没有一个特殊的源文件。我甚至不认为数组类型所包含的length字段也被认为是在该类中定义的,尽管我承认我没有检查;这是VM所特有的。
JLS 10.8定义了这一点。
https://stackoverflow.com/questions/2910774
复制相似问题