[英]Why isn't there a java.lang.Array class? If a java array is an Object, shouldn't it extend Object?
这是 java 包树: http ://docs.oracle.com/javase/7/docs/api/java/lang/package-tree.html
我读了一篇关于 Java 的教程,其中指出在 Java 中数组是对象。
数组类在哪里? 为什么我们可以制作这样的数组:
byte[] byteArr = new byte[];
char[] charArr = new char[];
int[] intArr = new int[];
并且数组将从 Object 继承方法; 例如:
byte thisByte = 1;
byte thatByte = 2;
byte[] theseBytes = new byte[] {thisByte, thatByte};
int inheritance = theseBytes.length; //inherited 'length' field and some methods
int wasntInWill = thatByte.length; //error
这里发生了什么?
编辑:
根据答案,我现在知道它是java.lang.reflect
包中的final
类。
我现在在我的 Android 项目中创建了一个包java.lang.reflect
并添加了一个名为 Array.java 的类。 为了确认这是原始类的方式,Eclipse 给了我错误“...已经存在于 path/to/android.jar”
如果我写出与java.lang.reflect.Array
相同的类但更改toString()
方法......这应该在我的应用程序中工作,对吗?
来自JLS :
每个数组都有一个关联的 Class 对象,与具有相同组件类型的所有其他数组共享。 [这] 就好像:数组类型的直接超类是 Object [并且] 每个数组类型都实现了接口 Cloneable 和 java.io.Serializable。
以下示例代码显示了这一点:
class Test {
public static void main(String[] args) {
int[] ia = new int[3];
System.out.println(ia.getClass());
System.out.println(ia.getClass().getSuperclass());
}
}
打印:
class [I
class java.lang.Object
其中字符串"[I"
是类对象"array with component type int"
的运行时类型签名。
是的,因为数组类型有效地扩展了 Object,你可以在 arrayObject 上调用 toString() 也可以看上面的例子
int arr[] = new arr[2];
arr.toString();
数组是一种语言特性——它们具有用于声明和访问的特定语法。 他们的类定义对你隐藏。
它们在反射 API 中有一个表示形式 - java.lang.reflect.Array
顺便说一句, length
字段不是从Object
继承的。 .getClass()
、 .toString()
等方法被继承。
对上述代码段稍加阐述:
public class ClassForName {
public static void main(String[] argv) throws ClassNotFoundException {
Class theClass = Class.forName("[I");
System.out.println(theClass.getName());
Class superClass = theClass.getSuperclass();
System.out.println(superClass.getName());
}
}
结果:
C:\JavaTools>java ClassForName
[I
java.lang.Object
可以看出,“[I”是类的名称,用英文称为“array of int”。 该类是一个“完全公民”的Java 类,它响应Object 的所有方法。 唯一不同的是new
的语法不同,不支持Class的newInstance()
方法。
(类“[I”、“[C”等,在 JVM 中是“预定义的”——没有对应于它们的 .class 文件。Java 也会在运行中隐式创建“[ MyJavaClass;" 类,如果您的程序中有一个“MyJavaClass”数组。)
为什么没有数组类?
有数组类,程序中使用的每种元素类型都有一个。 JLS 和 JVM Spec 都明确指出,数组的类对象是动态创建的。 JLS #10.8 “数组的类对象”和JVM Spec #5.3.3 “创建数组类” 。
如果一个java数组是一个对象,它不应该扩展
Object?
它确实扩展java.lang.Object.
JLS #10.8 明确指出“每个数组类型的直接超类是 Object。”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.