数组是java中的对象

Mik*_*e G 90 java

在java中我们可以声明一个类似的数组

String[] array = new String[10]; 
int size = array.length; 
Run Code Online (Sandbox Code Playgroud)

这是否意味着数组本身就是一个对象?因为在C++中,数组只是一个指针而没有任何方法.

Pau*_*aul 189

是.

Java语言规范部分4.3.1从以下开始:

对象是类实例或数组.

  • 到目前为止,我总是假设一个对象与类实例同义,并且数组是一种特殊的语言特性. (4认同)

mer*_*ike 57

是; Java语言规范写道:

在Java编程语言中,数组是对象(§4.3.1),是动态创建的,可以分配给Object类型的变量(§4.3.2).可以在数组上调用Object类的所有方法.

  • 不,它没有:Java规范[写](http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.3.1):"一个对象类实例或数组.类实例由类实例创建表达式(第15.9节)显式创建.数组由数组创建表达式(第15.10节)显式创建." 不,你不能扩展数组,因为extends子句[必须](http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.1.4)具有ClassType. (7认同)

nas*_*kin 34

好吧,让我们问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);
  }
}
Run Code Online (Sandbox Code Playgroud)

输出:

true
true
Run Code Online (Sandbox Code Playgroud)


Mar*_*ace 7

是的,它是Java中的一个对象.

还要注意,当你这样做时,array.length你不是在调用任何方法,只是访问数组的length字段.Arrays类中有很多静态方法.


ed2*_*209 5

值得注意的是,Java 中的数组有自己的字节码,它们不与对象共享。它们当然是对象,但在低级别的处理方式略有不同。


RFS*_*RFS 5

  1. 数组不是类树中列出的任何类的实例,但是每个数组都是一个对象并直接继承自java.util.Object
(new int[1]) instanceof Object   // -> evaluates to true
Run Code Online (Sandbox Code Playgroud)
  1. 该类java.util.Arrays是一个辅助类,数组不是该类的实例。
(new int[1]) instanceof java.util.Arrays    // -> compile error
Run Code Online (Sandbox Code Playgroud)
  1. 该类java.lang.reflect.Array是一个辅助类,数组不是该类的实例。
(new int[1]) instanceof java.lang.reflect.Array    // -> compile error
Run Code Online (Sandbox Code Playgroud)
  1. 数组继承了所有的成员java.lang.Object

  2. clone()数组重写从 继承的方法Object

  3. 数组实现了 field length,其中包含数组的组成部分的数量。长度可以是正数或零。它是publicfinal

  4. 数组实现接口Cloneablejava.io.Serializable

8a. 数组支持Class<T>Class<T>您可以从数组实例中检索实例

(new int[2]).getClass()
Run Code Online (Sandbox Code Playgroud)

或来自数组类型

int[].class
Run Code Online (Sandbox Code Playgroud)

8b. java.lang.Class<T>为代码中的每个不同数组类型创建一个唯一的反射类实例(即 的实例)。例子

int[].class.getCanonicalName()    //  -> "int[]"
String[].class.getCanonicalName() //  -> "java.lang.String[]" /
Run Code Online (Sandbox Code Playgroud)
  1. 重复一遍:数组是对象,但不是类树中任何类的实例。

参考

来自 Java 规范第 4.3.1 节“对象”

  • 对象是类实例或数组。

  • 类实例由类实例创建表达式显式创建。

  • 数组是由数组创建表达式显式创建的。

来自java.util.Arrays

  • 该类包含各种操作数组的方法(例如排序和搜索)

来自java.lang.reflect.Array

  • Array 类提供静态方法来动态创建和访问 Java 数组。

来自第 10.1 节对象

  • 数组类型的直接超类是Object

  • 每个数组类型都实现接口Cloneablejava.io.Serializable

来自第 10.7 节 数组成员

数组类型的成员如下:

  • 公共最终字段length,其中包含数组的组成部分的数量。长度可以是正数或零。

  • 公共方法clone,它重写类中的同名方法Object,并且不抛出已检查的异常。clone数组类型的方法的返回类型T[]T[]

  • 多维数组的克隆是浅的,也就是说它仅创建一个新数组。子数组是共享的。

  • 所有继承自Object类的成员;Object 唯一不被继承的方法是它的clone 方法。