当前位置: 首页 > 知识库问答 >
问题:

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

南门鸿振
2023-03-14

这个问题基本上是不言自明的。我还没有找到一个数组的应用编程接口(除了这个数组,但这只是定义了一堆用于处理实际数组的静态助手函数)。如果没有它的类,这似乎表明数组不可能是一个Object

然而,数组有公共字段,比如length,以及它可以调用的方法,比如。等于()。clone()似乎(非常强烈地)表明了完全相反的观点。

原语数组的奇怪表示和行为的解释是什么?

注意,我刚才试图在数组的. clone()方法上使用“开放实现”Eclipse特性,希望我能够看看这个方法是在哪里以及如何定义的(因为它说int[]从Object覆盖它),但它实际上导致了我的整个Eclipse冻结并崩溃...

共有3个答案

钮善
2023-03-14

请参阅下面的代码。它汇编了:

    int[] arr = new int[2];
    System.out.println(arr.toString());

现在,在任何基元类型上,您都不能调用Object类中定义的方法(toString())(或者,任何与此相关的方法)...因此,数组本质上是一个Object

好的,给你:

从JLS第4.3节:

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

第10节:

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

所以,从第一句话开始,Array实际上不是一个类。。。这是另一种类型。但是,从本质上说,数组是对象,虽然不是某些,但它们是数组类型。所以它们不是某个类的实例,可能是数组的对象。。。

阴焱
2023-03-14

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

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

每种数组类型都实现了接口Cloneablejava。伊奥。可序列化

此外:

对象是类实例或数组。

所以数组不是实例,因此不需要构造函数来创建它们。而是使用数组创建表达式。

尹俊贤
2023-03-14

每个数组类型都有一个类,所以有一个int[]类,有一个Foo[]类。这些类是由JVM创建的。您可以通过int[]. classFoo[]. 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);
}

还有一个编译时子类型规则,如果aB的子类型,a[]B[]的子类型。

 类似资料:
  • 问题内容: 这个问题基本上是不言而喻的。我无法找到用于数组的API(除了此Arrays之外,但这仅定义了一堆用于处理实际数组的静态辅助函数)。如果没有它的类,这似乎表明数组不能是。 然而,事实上,一个阵列具有公共领域,如和方法,它可以调用像和似乎暗示(强烈)相反完整。 对原始数组的奇数表示和行为有何解释? 作为说明,我现在尝试在数组的方法上使用“开放实现” Eclipse功能,希望我能够查看定义此

  • 问题内容: 我已经在这里阅读了很多帖子并在网上冲浪,但是也许我没有问正确的问题。我知道在集群可用之前,Redis目前是主/从服务器。但是,我想知道是否有人可以告诉我如何在逻辑上配置Redis以满足我的需要(或者如果它不是正确的工具)。 场景: 我们在美国的两端有2个站点。我们希望客户能够在每个站点上大量书写。然后,我们希望每个客户端也能够在其站点上执行读取。但是,我们希望在小于50ms的时间内从姐

  • 问题内容: 在我的项目中,我需要在运行时在数据库之间切换。我尝试使用Hibernate,但是卡在一个地方,我需要在数据库中映射对象和表。问题是,我有几个带前缀的表:documents2001,documents2002 …据我了解,我在运行时无法将类与表进行映射。我尝试使用iBatis,但问题出在运行时更改数据库。在iBatis中,这很难做到。 也许一些建议,我应该使用什么? 我的要求: 能够在运

  • 问题内容: 我是Kotlin的新手,正在玩数据类型。我选择了一个类型,然后尝试通过说来将其强制转换为a ,这在Java中是有效的(从语法上讲,但这是正确的)。但是,此操作失败,表示无法将Int强制转换为Double。我假设这是因为它是基于Integer类而不是原始的int数据类型构建的。我是正确的,最有价值的方法是什么?有一个功能,但这似乎效率低下且笨拙。 问题答案: 我花了一个类型,然后试图将它

  • 我是科特林的新手,我在玩数据类型。我取了一个<code>Int</code>类型,然后尝试将其转换为<code>Double</code>,将<code>num表示为Double>/code,这是一个在java中有效的调用(非语法上,但你明白了)。然而,这失败了,表示Int不能强制转换为Double。我假设这是因为它是基于Integer类而不是原始int数据类型构建的。我说得对吗?什么是最有效的价

  • 问题内容: 什么是原始类型? 问题答案: Java语言规范对原始类型的定义如下: JLS 4.8原始类型 原始类型定义为以下之一: 通过采用通用类型声明的名称而没有随附的类型参数列表形成的引用类型。 数组类型,其元素类型为原始类型。 未从的超类或超接口继承static的原始类型的非成员类型。RR 这是一个例子说明: 这是参数化类型(JLS 4.5)。通常,通俗地简称MyType为这种类型是很常见的