Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 数组是基元类型还是对象(或者完全是其他类型)?_Java_Arrays_Object_Primitive - Fatal编程技术网

Java 数组是基元类型还是对象(或者完全是其他类型)?

Java 数组是基元类型还是对象(或者完全是其他类型)?,java,arrays,object,primitive,Java,Arrays,Object,Primitive,这个问题基本上是不言自明的。我还没有找到用于数组的API(除此之外,这只是定义了一组用于处理实际数组的静态帮助函数)。如果它没有类,这似乎表明数组不能是对象 但是,数组具有公共字段(如length)以及可以调用的方法(如.equals()和.clone())这一事实似乎(非常强烈地)表明了完全相反的情况 对基元数组的奇怪表示和行为有什么解释 值得注意的是,我刚刚尝试在数组的.clone()方法上使用“Open Implementation”Eclipse特性,希望能够了解该方法的定义位置和定义方

这个问题基本上是不言自明的。我还没有找到用于数组的API(除此之外,这只是定义了一组用于处理实际数组的静态帮助函数)。如果它没有类,这似乎表明数组不能是
对象

但是,数组具有公共字段(如
length
)以及可以调用的方法(如
.equals()
.clone()
)这一事实似乎(非常强烈地)表明了完全相反的情况

对基元数组的奇怪表示和行为有什么解释

值得注意的是,我刚刚尝试在数组的
.clone()
方法上使用“Open Implementation”Eclipse特性,希望能够了解该方法的定义位置和定义方式(因为它说int[]从Object中重写了它),但实际上它导致了我的整个Eclipse冻结并崩溃…

它是一个Object

数组是一个容器对象,它包含固定数量的单一类型的值

参见

如此简短和简单,yes[]是一种
对象
。据我所知,它直接从
对象扩展而来。上面有所有的对象方法,
toString()
hashCode()
。。。加上一个名为
length
的特殊公开变量。类
java.util.Arrays
是一个用于处理数组类型的实用程序类。当您将诸如:
int[]
不继承自
Object[]
之类的内容添加到混乱中时,会有点混乱。此外,与其他
对象
类型不同,数组类型没有构造函数。他们尊重
new
关键字,但这通常是为大小分配的。这有点奇怪,但只是其中一个语言怪癖


不过,要回答这个问题,它们是一个对象。

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

    int[] arr = new int[2];
    System.out.println(arr.toString());
现在,在任何基元类型上,都不能调用对象类中定义的方法(
toString()
)(或者,任何方法)。。因此,数组本质上是一个
对象

好的,给你:-

从:-

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

而且,:-

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

因此,从第一句话开始,
Array
实际上不是一个类。。这是另一种类型。。但是,从本质上说,数组是对象,虽然不是某些
,但它们是
数组
类型。。因此,它们不是某些类的实例,可能是
数组的对象。
的定义就是这样创建的。

应该给您一个想法:

数组类型的直接超类是Object

每个数组类型都实现接口
Cloneable
java.io.Serializable

:

对象是类实例或数组


因此数组不是实例,因此不需要构造函数来创建它们。相反,您使用的是。

只使用我们已知的Java中的几种基本类型。基本上,我们仍然有几个步骤来创建数组,如声明、构造或初始化(如果需要),这意味着数组确实是一个对象


深入一点,原语类型可以用原始值存储在内存中,但对象是地址(引用)。所以我们可以想象一个悖论,如果数组是基元类型,我们如何将原始值存储在内存中?我认为与String相同,但是String是一个最终的对象,因此您可以用一种简单的方式构造一个对象,String s=“s”,就像一个基本类型一样。

每个数组类型都有一个类,因此有一个类用于
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);
}

还有一个编译时子类型规则,如果
a
B
的子类型,
a[]
B[]
的子类型,我已经看过了该文档,但是它的API在哪里?这是我在任何地方都找不到的。数组是一个对象。。。但是int[]不是从对象继承的吗?这使我困惑。我还对缺少构造函数感到困惑,因为我们使用
new
。。。这是怎么回事?基元数组基本上是对象和硬连线基元之间的交叉点吗?没有int[]不是从对象[]继承的。像int[]和Object[],String[]。。。所有这些都不同,因为它们都继承自对象,而不是对象[]。泛型有助于编写接受数组的方法,以及我提到的数组实用程序类,但是的,这种奇怪的怪癖有时会导致一些古怪的代码,只是为了让类型对齐如果int[]不是从对象继承的,并且int[]不是基元,它是什么?Java的主要准则(即所有对象都扩展
对象
)是否不完全正确,并且数组属于一个单独的对象类别?请将
[]
作为类名的一部分。所以这里有
int
,它是原语。有一个
整数
,它是一个
对象
。还有
int[]
,这是另一种类型的
对象
。@Jeff有一些信息。虽然这个问题是针对二维阵列的,但这里的答案应该会让你对其机制有一些了解。我知道。我以前使用过数组。当意识到数组的行为与实际的常规对象有多大的不同时,这个问题就出现了。例如,在“new”声明中,不使用
newint[2]()