我可以重写 的任何方法吗array?
例如toString()或其他方法。
import java.lang.reflect.Method;
public class ArraysClassTest {
static int[] array = { 1, 2, 3, 1 };
public static void main(String[] args) {
Class<? extends int[]> class1 = array.getClass();
try {
Method method = class1.getMethod("toString");
} catch (NoSuchMethodException | SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Run Code Online (Sandbox Code Playgroud)
您无法更改数组的任何功能。JLS \xc2\xa710.7 Array Members指定数组的每个成员:
\n\n\n\n\n数组类型的成员如下:
\n\n\n
\n- \n
字段
publicfinal,length包含数组的组成部分的数量。length可以是正数或零。- \n
方法,它重写类中同名的方法并且不抛出已检查的异常
\n\npublic。数组类型的方法的返回类型是。cloneObjectcloneT[]T[]多维数组的克隆是浅的,也就是说它仅创建一个新数组。子数组是共享的。
- \n
所有从类继承的成员
Object;唯一Object不被继承的方法是它的clone方法。
该规范不允许以任何方式自定义此实现。toString()例如,数组的方法始终是从 继承的基本方法Object。
为了创建数组对象,编译器会向已编译的Java 字节码发出三个指令之一:newarray对于基元、anewarray对于引用类型或multinewarray对于所有多维数组。在实现这些指令时,虚拟机根据运行时的需要创建每个数组类(JVMS \xc2\xa75.3.3创建数组类)。VM 还为编译器定义了专用字节码指令,用于获取和设置数组元素以及获取数组的长度。
没有指定如何在虚拟机内实现阵列。它纯粹是一个实现细节,甚至 Java 编译器也不知道,也不关心。涉及的实际代码取决于您运行程序的虚拟机的风格、该 VM 的版本、其运行的操作系统和 CPU,以及 VM 配置的任何相关运行时选项(例如,无论是否处于解释模式)。
\n\n快速浏览一下 OpenJDK 8 源代码就会发现一些与数组相关的机制:
\n\nsrc/share/vm/interpreter/bytecodeInterpreter.cpp \xe2\x80\x93 实现解释器的字节码指令,包括创建和访问数组的指令。然而,它是曲折而复杂的。
src/share/vm/c1/c1_RangeCheckElimination.cpp \xe2\x80\x93 在从字节码编译为本机代码时执行一些巧妙的数组边界检查消除。
由于数组是该语言和虚拟机的核心功能,因此不可能指向任何一个源文件并说“这里,这就是代码class Array”。数组很特殊,实现它们的机制实际上无处不在。
如果你想自定义数组的行为,你唯一能做的就是不直接使用数组,而是使用、子类化或编写内部包含数组的集合类。这使您可以完全自由地定义类的行为和性能特征。但是,不可能使自定义类成为Java 语言意义上的数组。这意味着您无法使其实现[]运算符或可传递给需要数组的方法。