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