我可以告诉Java使用除Object之外的类作为默认基类吗?

时间:2014-08-10 10:31:16

标签: java javac

假设我找到了缺省基类Object中缺少的东西,并编写了我自己的类来代替使用。

class MyObject extends Object
{
    ...
}

有没有办法告诉Java编译器使用我的新类作为基类而不是Object类?

因此避免

class MyClass extends MyObject

然后去

class MyClass

让它使用命令行参数隐式扩展MyObject到编译

javac MyClass --defaultBase=MyObject

这意味着所有Jars和预编译的Class文件都会使用Object,但我自己编译的任何东西都会使用我自己的类,当然除了我的新基类。 (我不想要循环依赖,是吗。)

3 个答案:

答案 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参数传递。