Java 您可以创建一个没有对象作为基类的类结构吗

Java 您可以创建一个没有对象作为基类的类结构吗,java,object,jvm,Java,Object,Jvm,据我所知:Java中的每个类都继承对象类的方法,而不需要指定方法,这使得这个类非常独特和有趣 因此我想知道,在JVM中,这个“规则”是在哪里指定的?这个类是否可以进行某种操作,例如添加或删除方法或变量?是否可以独立于对象类创建平行的层次结构?规则在: [T] 类类型C的直接超类是C声明的extends子句中给出的类型(如果存在extends子句),或者是对象 每个类要么是对象的直接子类,要么不提供扩展子句,要么显式扩展对象,要么是对象的间接子类,要么显式扩展对象的另一个子类 因此,该类层次结构中

据我所知:Java中的每个类都继承对象类的方法,而不需要指定方法,这使得这个类非常独特和有趣


因此我想知道,在JVM中,这个“规则”是在哪里指定的?这个类是否可以进行某种操作,例如添加或删除方法或变量?是否可以独立于对象类创建平行的层次结构?

规则在:

[T] 类类型C的直接超类是C声明的extends子句中给出的类型(如果存在extends子句),或者是对象

每个类要么是
对象
的直接子类,要么不提供
扩展
子句,要么显式扩展
对象
,要么是
对象
的间接子类,要么显式扩展
对象
的另一个子类


因此,该类层次结构中的类必须直接或间接扩展
对象
;不可能有任何其他对象层次结构独立于
对象

Java对象类是您声明的所有类的超类

据甲骨文称:

java.lang包中的对象类位于 类层次结构树。每个阶级都是直接或间接的后代, 对象类的。您使用或编写的每个类都继承 对象的实例方法。您不需要使用这些方法中的任何一种, 但是,如果您选择这样做,您可能需要用代码覆盖它们 这是你们班特有的

可以重写对象类中的方法以满足您的需要

例如:在POJO中重写
equals()
hashcode()
是一种常见做法


您还应该了解如何在运行时修改对象的行为

对象类本身确实很特殊。如果您在jre文件夹的
rt.jar
中查看它的实现,您会注意到它的大多数方法只是带有
本机
修饰符的声明

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 {}
}
包java.lang;
公共类对象
{
私有静态本机void注册表项();
公共最终本机类getClass();
公共本机int hashCode();
公共布尔等于(对象参数对象)
{
返回this==paramObject;
}
受保护的本机对象克隆()
抛出CloneNotSupportedException;
公共字符串toString()
{
返回getClass().getName()+“@”+Integer.toHexString(hashCode());
}
公共最终本机void notify();
公共最终本机void notifyAll();
公共最终本机无效等待(长参数长)
抛出中断异常;
公共最终无效等待(long paramLong,int paramInt)
抛出中断异常
{
如果(参数长度<0升){
抛出新的IllegalArgumentException(“超时值为负”);
}
if((参数<0)| |(参数>999999)){
抛出新的IllegalArgumentException(“纳秒超时值超出范围”);
}
如果(参数>0){
参数长+=1L;
}
等待(长);
}
公共最终无效等待()
抛出中断异常
{
等待(0L);
}
受保护的void finalize()
扔掉的
{}
静态{}
}
这些本机方法是在JVM本身内部实现的。这些方法是Java程序本机部分和托管部分之间的桥梁。因此,将这个
对象
类作为“每个对象中的公共事物”是很自然的。Java语言的指定方式是,除了
对象
之外,无法构建单独的类层次结构

关于修改
对象
虽然我还没有尝试过,但是可以修改原始对象类。可以肯定的是,不能删除现有的方法,因为大多数运行时都依赖于它们,但我认为可以通过修改运行时本身来添加新方法

您似乎无法使用来修改
对象
字符串
类加载器
保护域
非法类格式异常
,以及数组类

  • 在JVM中,这个“规则”是在哪里指定的
  • 它不是由JVM完成的。编译器将
    扩展对象
    添加到类中

  • 这个班能被操纵吗
  • 没有

  • 是否可以独立于对象类创建并行的层次结构

  • 不,你不能。每个java类无论如何都会扩展
    对象
    类,你无法避免它

    如果你想创建一个不是直接或间接从
    java.lang.Object派生的类
    ,你必须创建一个没有指定

    现在,如果您查看解析类文件的JDK代码,您会发现类文件解析器执行以下操作:


    所以它会拒绝你的基类。只有
    java.lang.Object
    可以没有超类。

    哇,这为我如何看待java打开了一个全新的领域。我看到还有很多新东西要学。。这很有趣。如果
    对象
    是唯一一个不从另一个对象继承的对象,那么
    对象
    如何在Java中本机实现?@tac请看wero的精彩答案,我认为这回答了这个问题
    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 {