数组是Java中的对象吗


93

在Java中,我们可以声明一个数组,例如

String[] array = new String[10]; 
int size = array.length; 

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


5
不,在C ++中,数组是数组,而不是数组。
Kerrek SB 2012年

42
if (array instanceof Object) System.out.println("Yes!")
skaffman 2012年

6
哦,在C ++中,数组和指针都是对象。
R. Martinho Fernandes 2012年

2
@ R.MartinhoFernandes实际上,所有C ++数组都是C ++对象,但是有些C ++指针不是C ++对象,也就是说,所有指针都是计算右值的结果。实例包括&xp+inew int(42)
fredoverflow

1
@skaffman该消息不是严格必需的,因为它不会以其他方式编译。
shmosel

Answers:



60

是; Java语言规范写道

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


如果array是一个对象,那不意味着它是一个类的实例吗?如果是这样,我可以延长该课程吗?
一二三

9
不,不是这样的:Java规范写道:“对象是类实例或数组。类实例由类实例创建表达式(第15.9节)显式创建。数组由数组创建表达式显式创建。 (§15.10)。”。不,您不能扩展数组,因为extends子句必须具有ClassType。
meriton

36

好吧,让我们问一下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

1
您也可以声明int[] someIntegers = {42};,以得到相同的结果。
Holger

7

是的,它是Java中的对象。

还要注意,执行此操作时,您array.length不会调用任何方法,而只是访问数组的length字段。Arrays类中有很多静态方法。


3

重要的是要注意,Java中的数组具有自己的字节码,它们不与对象共享。它们当然是对象,但在底层上的处理略有不同。


2

我会说答案是肯定的,尽管我可以补充一点,严格来说,数组也是C ++中的一个对象。从当前标准(FDIS)的§1.8[介绍对象]:

一个对象是存储的区域。



1

java中的每个数组都是ex int [] a = new int [2]的对象;所以new用于创建对象,因为它是对象,所以我们可以使用a.getClass()。getName();来检查类名称。


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

  2. 数组会覆盖从clone()继承的方法Object

  3. 数组实现字段length,其中包含数组的组件数。长度可以是正数或零。是publicfinal

  4. 数组实现接口Cloneablejava.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[]" /
  1. 重复:数组是对象,但不是类树中任何类的实例。

参考资料

根据Java规范的第4.3.1节对象

  • 对象是类实例或数组。

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

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

java.util.Arrays

  • 此类包含各种用于处理数组的方法(例如排序和搜索)

java.lang.reflect.Array

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

10.1节对象开始

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

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

第10.7节数组成员

数组类型的成员都是以下所有:

  • public final字段length,其中包含数组的组件数。长度可以是正数或零。

  • 公共方法clone,它覆盖类中相同名称的方法,Object并且不引发任何检查的异常。clone数组类型方法的返回类型T[]T[]

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

  • 所有成员都从Object类继承;不继承的对象的唯一方法是其克隆方法。


1

任何东西的数组都是对象。一个可以调用的方法,如equalshashcode等:

final int[] i = {};
i.equals(new int[] {1});  // false
i.hashcode();

一个不能调用本机类型的方法。


0

观察下面的代码片段和输出。

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被视为对象。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.