根据 Java Language Specification:
In the Java programming language, arrays are objects (§4.3.1), are dynamically created, and may be assigned to variables of type Object (§4.3.2). All methods of class Object may be invoked on an array.
数组是对象, 但不是从某个类实例化来的,而是由 JVM 直接创建的, 其父类是 Object
, 所以可以调用 Object
类中的所有方法:
Student[] stuArr = new Student[10];
// stuArr is an Object
System.out.println(stuArr instanceof Student[]); // true
System.out.println(stuArr instanceof Object); // true
// stuArr's supper class is
System.out.println(stuArr.getClass().getSuperclass().getName()); // java.lang.Object
// stuArr's class is
System.out.println(stuArr.getClass().getName()); // [Lcom.atguigu.javase.javabean.Student;
// toString()
System.out.println(stuArr.toString()); // [Lcom.atguigu.javase.javabean.Student;@2530c12
进一步查看常见数组类的类名, 发现 primitive 是一类, reference 类型比较麻烦, 是 [
+ 若干L
+ 类的全限定名
:
byte[] byteArr = {0, 1, 2, 3};
short[] shortArr = {0, 1, 2, 3};
int[] intArr = {0, 1, 2, 3};
long[] longArr = {0L, 1L, 2L, 3L};
float[] floatArr = {.1F, .2F, .3F, .4F};
double[] doubleArr = {.1, .2, .3, .4};
boolean[] booleanArr = {true, false};
char[] charArr = {'a', 'b', 'c'};
String[] stringArr = {"aa", "bb", "cc"};
System.out.println(byteArr.getClass().getName()); // [B
System.out.println(shortArr.getClass().getName()); //[S
System.out.println(intArr.getClass().getName()); // [I
System.out.println(longArr.getClass().getName()); // [J
System.out.println(floatArr.getClass().getName()); // [F
System.out.println(doubleArr.getClass().getName()); // [D
System.out.println(booleanArr.getClass().getName()); // [Z
System.out.println(charArr.getClass().getName()); // [C
System.out.println(stringArr.getClass().getName()); //[Ljava.lang.String;
数组声明时是 new Student[n]
而不是 new Student()
, 说明数组声明和创建时, 并没有调用相应 Student
类的构造器, 同时, 既然数组本身是一个对象, 但数组类并没有构造器:
System.out.println(stuArr.getClass().getConstructors().length); // 0
References:
[1] 谈谈JAVA的数组(数组是对象吗?)
[2] JAVA中的数组是对象吗?
[3] Java Language Specification