您可以创建一个没有Object作为其基类的类结构

时间:2016-03-01 18:05:18

标签: java object jvm

据我所知:Java中的每个类都继承了Object Class的方法,而不需要指定这样做,这使得这个类如此独特和有趣。

因此我想知道,在JVM中指定了这个“规则”在哪里?可以以某种方式操纵此类,例如添加或删除方法或变量吗?是否可以独立于Object类创建并行的分层结构?

5 个答案:

答案 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修改ObjectStringClassLoaderClass<?>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)

规则在JLS, Section 8.1.4

中指定
  

[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)

  
      
  1. 这是&#34;规则&#34;在JVM内部指定?
  2.   

它不是由JVM完成的。编译器将extends Object添加到您的类中。

  
      
  1. 这个班级可以以某种方式被操纵
  2.   

NO

  
      
  1. 是否可以独立于Object类创建并行的分层结构?
  2.   

没有。你不能。无论如何,每个java类都将扩展Object类,你只能避免它