数组是原始类型还是对象(或其他完全不同的东西)?

ast*_*eri 54 java arrays primitive object

这个问题基本上是不言自明的.我无法找到数组的API(除了这个数组,但这只是定义了一堆用于处理实际数组的静态辅助函数).如果没有它的类,这似乎表明一个数组不能是一个Object.

但是,一个数组具有公共字段length和它可以调用的方法这样的事实,.equals()并且.clone()似乎(非常强烈地)建议完全相反.

对于原始数组的奇怪表示和行为有什么解释?

作为一个注释,我试着在.clone()刚才的数组方法上使用"Open Implementation"Eclipse特性,希望我能够看看这个方法的定义位置和方法(因为它说int []覆盖了它对象),但它实际上导致我的整个Eclipse冻结并崩溃......

irr*_*ble 63

每个数组类型都有一个类,所以有一个类int[],有一个类Foo[].这些类由JVM创建.你可以通过int[].class,访问它们Foo[].class.这些类的直接超类是Object.class

public static void main(String[] args)
{
    test(int[].class);
    test(String[].class);
}

static void test(Class clazz)
{
    System.out.println(clazz.getName());
    System.out.println(clazz.getSuperclass());
    for(Class face : clazz.getInterfaces())
        System.out.println(face);
}
Run Code Online (Sandbox Code Playgroud)

还有一个编译时亚型规则,如果A是的亚型B,A[]是的亚型B[].


Baz*_*Baz 27

Java语言规范应该给你一个想法:

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

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

而且:

对象是类实例或数组.

因此数组不是实例,因此您不需要构造函数来创建它们.而是使用阵列创建表达式.


Roh*_*ain 15

请参阅以下代码.汇编: -

    int[] arr = new int[2];
    System.out.println(arr.toString());
Run Code Online (Sandbox Code Playgroud)

现在,在任何原始类型上,你都不能调用toString()Object类中定义的method()(或者,任何方法).所以,一个数组本质上是一个Object..

好的,你走了: -

来自JLS第4.3节: -

有四种引用类型:类类型(§8),接口类型(§9),类型变量(§4.4)和数组类型(§10).

并且,第10节: -

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

因此,从第一个引用,Array实际上不是一个类..它是另一种类型..但是,本质上数组是对象,虽然不是一些Class,但它们是Array类型的..所以它们不是某些类的实例,并且可能是array被定义为以这种方式创建的对象..

  • 我更想知道是否有人不喜欢我的答案,以便我可以改进它,而不是仅仅看到对它的反对票。 (2认同)

Gre*_*lli 7

如此简短,是的<Type> []是一种类型Object.它Object根据我的理解直接延伸.有上的所有对象方法toString(),hashCode()......加上称为特殊暴露变量length.该类java.util.Arrays是用于处理数组类型的实用程序类.当你添加诸如以下内容之类的东西时,这有点令人困惑: int[]不会继承Object[].此外,与其他Object类型不同,没有数组类型的构造函数.他们尊重new关键字,但通常是为大小分配.这有点奇怪,但只是其中一个语言怪癖.

要回答这个问题,是的,他们是一个对象.

  • 将`[]`视为类名的一部分.所以有一个原始的`int`.有一个`Integer`是一个`Object`.还有`int []`是另一种`Object`. (2认同)
  • @Jeff [这里]有一些信息(http://stackoverflow.com/questions/2319724/multidimensional-arrays-in-java-extends-which-class).虽然这个问题针对的是2d数组,但那里的答案应该会让你对这些机制有所了解. (2认同)