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