这是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
这里发生了什么?
修改
根据答案,我现在知道它是final
包中的java.lang.reflect
类。
我现在在Android项目中创建了一个包java.lang.reflect
,并为其添加了一个名为Array.java的类。为了确认这是原始类的方式,Eclipse给了我错误“...已存在于path / to / android.jar”
如果我写出与java.lang.reflect.Array
相同的课程,但更改了toString()
方法......这应该适合我的申请?
答案 0 :(得分:41)
来自JLS:
每个数组都有一个关联的Class对象,与其他所有对象共享 具有相同组件类型的数组。 [This]就像:数组的直接超类 type是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();
答案 1 :(得分:9)
数组是一种语言功能 - 它们具有用于声明和访问的特定语法。他们的班级定义对你来说是隐藏的。
他们在反思API中有一个表示 - java.lang.reflect.Array
顺便说一句,length
字段不是从Object
继承的。 <{1}},.getClass()
等方法是继承的。
答案 2 :(得分:7)
稍微详细说明上述代码段:
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”数组。)
答案 3 :(得分:2)
为什么没有数组类?
是数组类,每个元素类型一个,在程序中使用。 JLS和JVM Spec都清楚地说明了动态创建了一个数组的类对象。 JLS #10.8 'Class Objects for Arrays'和JVM Spec #5.3.3 'Creating Array Classes'。
如果java数组是Object,则不应扩展
Object?
它确实扩展了java.lang.Object.
JLS#10.8明确指出'每个数组类型的直接超类都是Object。'