Java 您可以创建一个没有对象作为基类的类结构吗
据我所知:Java中的每个类都继承对象类的方法,而不需要指定方法,这使得这个类非常独特和有趣Java 您可以创建一个没有对象作为基类的类结构吗,java,object,jvm,Java,Object,Jvm,据我所知:Java中的每个类都继承对象类的方法,而不需要指定方法,这使得这个类非常独特和有趣 因此我想知道,在JVM中,这个“规则”是在哪里指定的?这个类是否可以进行某种操作,例如添加或删除方法或变量?是否可以独立于对象类创建平行的层次结构?规则在: [T] 类类型C的直接超类是C声明的extends子句中给出的类型(如果存在extends子句),或者是对象 每个类要么是对象的直接子类,要么不提供扩展子句,要么显式扩展对象,要么是对象的间接子类,要么显式扩展对象的另一个子类 因此,该类层次结构中
因此我想知道,在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语言的指定方式是,除了对象
之外,无法构建单独的类层次结构
关于修改对象
虽然我还没有尝试过,但是可以修改原始对象类。可以肯定的是,不能删除现有的方法,因为大多数运行时都依赖于它们,但我认为可以通过修改运行时本身来添加新方法
您似乎无法使用来修改对象
,字符串
,类加载器
,类
,保护域
,非法类格式异常
,以及数组类
扩展对象
添加到类中
不,你不能。每个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 {