再者,如果数组是类的话,那么他应该有一个构造函数。 可是这样写的话 int[] i = int[].class.newInstance(); 会抛出 java.lang.InstantiationException: [I at java.lang.Class.newInstance(Class.java:359) at test.MathExpression.main(MathExpression.java:134) 实例化失败,一般来说,这个异常是没有默认的构造函数才会导致的·。 我假设数组这个“类”有其他的构造函数,那么我把数组这个类的构造函数的数量输出来。 int[] i = new int[3]; System.out.println(i.getClass().getDeclaredConstructors().length); 结果是0,这说明,数组这个“类”没有构造函数。 没有构造函数的“类”也能叫构造函数?
再来看看数组实例化时的字节码和普通类实例化的字节码有什么区别 public class Test{ public static void main(String[] args){ Integer it = new Integer(3); int[] i = new int[3]; } } 先 javac java.Test 再 javap -c Test.class 主意到main函数的0:字节码为new,这是对应Integer it = new Integer(3); 说明实例化一个类的对象的字节码为“new” 然而标号为10的地方的字节码是“newarray” 并不是实例化对象的”new"字节码 说明虚拟机对数组实例化和普通类实例化的操作是不一样的。 既然不一样,那么数组又怎么能算个类呢?
Class 类的实例表示正在运行的 Java 应用程序中的类和接口。枚举是一种类,注释是一种接口。每个数组属于被映射为 Class 对象的一个类,所有具有相同元素类型和维数的数组都共享该 Class 对象。基本的 Java 类型(boolean、byte、char、short、int、long、float 和 double)和关键字 void 也表示为 Class 对象。 引用自Java 6的API文档,数组类的确是类,虽然它十分特殊。Class类是代表类的类,每个数组类都是在运行时动态生成的。Class.forName("int")会失败,因为int不是类,但是Class.forName("[I")是可以取到int[]的Class对象的。 再说,如果数组类不是类的话,Object类型的变量还能引用数组类对象么?数组类对象拥有Object的方法,所以数组类是继承自Object的,甚至数组类还实现了Cloneable和Serializable接口。