据我所知:Java中的每个类都继承了Object Class的方法,而不需要指定这样做,这使得这个类如此独特和有趣。
因此我想知道,在JVM中指定了这个“规则”在哪里?可以以某种方式操纵此类,例如添加或删除方法或变量吗?是否可以独立于Object类创建并行的分层结构?
答案 0 :(得分:11)
Object
类本身确实很特别。如果您在jre文件夹中查看它在rt.jar
中的实现,您会注意到它的大多数方法只是带有native
修饰符的声明。
package java.lang;
public class Object
{
private static native void registerNatives();
public final native Class<?> getClass();
public native int hashCode();
public boolean equals(Object paramObject)
{
return this == paramObject;
}
protected native Object clone()
throws CloneNotSupportedException;
public String toString()
{
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}
public final native void notify();
public final native void notifyAll();
public final native void wait(long paramLong)
throws InterruptedException;
public final void wait(long paramLong, int paramInt)
throws InterruptedException
{
if (paramLong < 0L) {
throw new IllegalArgumentException("timeout value is negative");
}
if ((paramInt < 0) || (paramInt > 999999)) {
throw new IllegalArgumentException("nanosecond timeout value out of range");
}
if (paramInt > 0) {
paramLong += 1L;
}
wait(paramLong);
}
public final void wait()
throws InterruptedException
{
wait(0L);
}
protected void finalize()
throws Throwable
{}
static {}
}
这些本机方法是在JVM本身内部实现的。这些方法是Java程序的本机部分和托管部分之间的桥梁。因此,将Object
类视为“每个对象中的常见事物”是很自然的。 Java语言的指定方式是除Object
之外无法构建单独的类层次结构。
Object
虽然我还没有尝试过,但可能可以修改原始的Object类。确保现有方法无法删除,因为大多数运行时依赖于它们,但我发现有可能通过修改运行时本身来添加新方法。
您似乎无法使用java agents修改Object
,String
,ClassLoader
,Class<?>
,ProtectionDomain
,{{1}和数组类。
答案 1 :(得分:9)
如果要创建一个不直接或间接从java.lang.Object
派生的类,则必须创建一个没有指定superclass的类文件。
现在,如果查看解析类文件的JDK代码,您会发现类文件解析器执行此操作check:
if (super_class_index == 0) {
check_property(class_name == vmSymbols::java_lang_Object(),
"Invalid superclass index %u in class file %s",
super_class_index,
CHECK_(nullHandle));
} else {
所以它会拒绝你的基类。只有java.lang.Object
没有超类。
答案 2 :(得分:8)
[T]类型C的直接超类是如果存在extends子句则在C语句的extends子句中给出的类型,否则是Object。
每个类都是Object
的直接子类,要么不提供extends
子句,要么显式扩展Object
,或者Object
的间接子类,显式扩展Object
的另一个子类。
因此,此类层次结构中的类必须直接或间接扩展Object
;没有其他对象层次结构独立于Object
。
答案 3 :(得分:4)
Java对象类是您声明的所有类的超类。
根据Oracle的说法:
java.lang包中的Object类位于顶部 类层次结构树。每个班级都是直系或间接的后代, Object类的。您使用或编写的每个类都继承 Object的实例方法。你不需要使用任何这些方法, 但是,如果您选择这样做,您可能需要使用代码覆盖它们 这是特定于你的班级。
可以覆盖Object类中的方法以满足您的需要。
例如:在POJO中覆盖equals()
和hashcode()
是一种常见做法。
您还应该查看Reflection API以了解如何在运行时修改Object的行为。
答案 4 :(得分:4)
- 这是&#34;规则&#34;在JVM内部指定?
醇>
它不是由JVM完成的。编译器将extends Object
添加到您的类中。
- 这个班级可以以某种方式被操纵
醇>
NO
- 是否可以独立于Object类创建并行的分层结构?
醇>
没有。你不能。无论如何,每个java类都将扩展Object
类,你只能避免它