在Java中,我们可以声明一个数组,例如
String[] array = new String[10];
int size = array.length;
这是否意味着数组本身是一个对象?因为在C ++中,数组只是一个指针,没有任何方法。
if (array instanceof Object) System.out.println("Yes!")
&x,p+i和new int(42)。
在Java中,我们可以声明一个数组,例如
String[] array = new String[10];
int size = array.length;
这是否意味着数组本身是一个对象?因为在C ++中,数组只是一个指针,没有任何方法。
if (array instanceof Object) System.out.println("Yes!")
&x,p+i和new int(42)。
Answers:
我只想添加一下,数组在反射API中有一个表示形式-java.lang.reflect.Array。
java中的每个数组都是ex int [] a = new int [2]的对象;所以new用于创建对象,因为它是对象,所以我们可以使用a.getClass()。getName();来检查类名称。
java.util.Object(new int[1]) instanceof Object // -> evaluates to true
java.util.Arrays是一个辅助类,数组不是该类的实例。(new int[1]) instanceof java.util.Arrays // -> compile error
java.lang.reflect.Array是一个辅助类,数组不是该类的实例。(new int[1]) instanceof java.lang.reflect.Array // -> compile error
数组继承了的所有成员 java.lang.Object
数组会覆盖从clone()继承的方法Object。
数组实现字段length,其中包含数组的组件数。长度可以是正数或零。是public和final。
数组实现接口Cloneable和java.io.Serializable。
8a。数组受支持Class<T>。您可以Class<T>从数组实例检索实例
(new int[2]).getClass()
或来自数组类型
int[].class
8b。java.lang.Class<T>在代码中为每种不同的数组类型创建一个唯一的反射类实例(即的一个实例)。例子
int[].class.getCanonicalName() // -> "int[]"
String[].class.getCanonicalName() // -> "java.lang.String[]" /
参考资料
根据Java规范的第4.3.1节对象
对象是类实例或数组。
类实例是由类实例创建表达式显式创建的。
数组是由数组创建表达式显式创建的。
数组类型的直接超类为Object。
每种数组类型都实现接口Cloneable和java.io.Serializable。
数组类型的成员都是以下所有:
public final字段length,其中包含数组的组件数。长度可以是正数或零。
公共方法clone,它覆盖类中相同名称的方法,Object并且不引发任何检查的异常。clone数组类型方法的返回类型T[]为T[]。
多维数组的克隆很浅,也就是说,它仅创建一个新数组。子数组是共享的。
所有成员都从Object类继承;不继承的对象的唯一方法是其克隆方法。
观察下面的代码片段和输出。
public class Tester {
int a[];
public static void main(String[] args) {
System.out.println(new Tester().a);// null
System.out.println(new Tester().a[0]);// Exception in thread "main" java.lang.NullPointerException \n at mainclass.Tester.main(Tester.java:10)
}
}
显然数组a被视为对象。