在Java中,我们可以声明一个数组,如
String[] array = new String[10];
int size = array.length;
这是否意味着数组本身是一个对象?因为在C ++中,数组只是一个指针,没有任何方法。
是; Java语言规范writes:
在Java编程语言中,数组是对象(第4.3.1节),是动态创建的,并且可以分配给对象类型(第4.3.2节)的变量。 Object类的所有方法都可以在数组上调用。
好,让我们问一下Java!
public class HelloWorld
{
public static void main(String[] args)
{
System.out.println(args instanceof Object);
int[] someIntegers = new int[] {42};
System.out.println(someIntegers instanceof Object);
}
}
输出:
true
true
是,它是Java中的对象。
还请注意,当您执行array.length
时,您不会调用任何方法,而只是访问数组的length
字段。 Arrays类中有很多静态方法。
值得注意的是,Java中的数组具有自己的字节码,它们不与对象共享。它们当然是对象,但在底层上的处理略有不同。
我会说答案是肯定的,尽管严格地说,我可以补充一点,数组也是C ++中的对象。从当前标准(FDIS)的§1.8[介绍对象]:
[是存储区域。
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>
实例
Class<T>
或来自数组类型
(new int[2]).getClass()
8b中。为代码中的每个不同数组类型创建一个唯一的反射类实例(即int[].class
的实例)。实施例
java.lang.Class<T>
要重复:数组是对象,但不是类树中任何类的实例。
根据Java规范int[].class.getCanonicalName() // -> "int[]"
String[].class.getCanonicalName() // -> "java.lang.String[]" /
对象是类实例或数组。
类实例是由类实例创建表达式显式创建的。
数组是由数组创建表达式显式创建的。
数组类型的直接超类是Section 10.1 Objects。
每个数组类型都实现接口Object
和Cloneable
。
java.io.Serializable
数组类型的成员都是以下所有:
最终公共字段Section 10.7 Array Members,其中包含数组的组件数。长度可以是正数或零。
公用方法length
,它重写类clone
中相同名称的方法,并且不引发任何检查的异常。数组类型为Object
的clone
方法的返回类型为T[]
。
多维数组的克隆很浅,也就是说,它仅创建一个新数组。子数组是共享的。
所有从类Object继承的成员;不继承的对象的唯一方法是其克隆方法。