假设我找到了缺省基类Object中缺少的东西,并编写了我自己的类来代替使用。
class MyObject extends Object
{
...
}
有没有办法告诉Java编译器使用我的新类作为基类而不是Object类?
因此避免
class MyClass extends MyObject
然后去
class MyClass
让它使用命令行参数隐式扩展MyObject到编译
javac MyClass --defaultBase=MyObject
这意味着所有Jars和预编译的Class文件都会使用Object,但我自己编译的任何东西都会使用我自己的类,当然除了我的新基类。 (我不想要循环依赖,是吗。)
答案 0 :(得分:1)
您可以在许多限制内更改Object
课程,但这不是一个好主意。最好的解决方案是创建自己的类,希望其他类扩展。
如果要扩展Object,最好的选择是创建一个以Object作为参数的Utility方法。
答案 1 :(得分:1)
有没有办法告诉Java编译器使用我的新类作为基类而不是Object类?
没有。你不能。
Java语言规范(JLS 4.3.2)声明java.lang.Object
类是所有其他类的超类。如果编译器没有实现它,那么它就不是兼容的Java编译器。无论如何,我知道没有Java编译器("兼容"或者不是)允许你这样做。
@Peter Lawrey提到可以更改Object
课程。这是真的......如果你知道你在做什么。但是依赖于Object
类的内部细节,硬连接到其他类......以及JVM的本机代码实现。如果您更改了某些内容(例如,添加实例字段或更改方法签名),您可能会破坏JVM,Java工具链中的工具和/或第三方库和工具(例如您最喜欢的IDE!)。破损可能是灾难性的,难以诊断。
最重要的是,如果您的更改没有破坏Java,那么您仍然会遇到真正的 JVM无法运行您的代码的问题。这使得使用Object进行编辑是一个可行的命题,仅用于研究目的" ......充其量。
答案 2 :(得分:0)
对于记录,技术上可以使用-Xbootclasspath
VM选项覆盖Java运行时库的核心类(类型java -X
以获取信息)。但是,这并非由普通开发人员完成(请参阅此问题的其他答案)。
例如,您可以自行尝试将java.lang.Object
的源代码修改并编译到名为core-classes
的目录,并将-Xbootclasspath/p:core-classes
作为JVM参数传递。