未扩展 java.lang.Object 的类

问题描述 投票:0回答:5
当您在 Java 中创建用户定义的类时,您没有将其指定为扩展 Object。但类仍然是一个对象。这是如何运作的? javac或JVM如何将类的所有属性注入到用户定义的类中?

java inheritance
5个回答
13
投票
如果您实际上没有编写

extends Object

,编译器会为您插入它。

编辑:显然我对是否确实存在代码插入造成了一些困惑。我自己也不完全确定,所以我做了一个小实验:在文件中创建以下类test.java

public class test {}

并编译,然后运行

javap -c test

反汇编字节码。 看看结果:

从“test.java”编译 公共类测试扩展了java.lang.Object{ 公共测试(); 代码: 0:aload_0 1:调用特殊#1; //方法 java/lang/Object."":()V 4:返回 }

所以,是的,编译器

确实实际上将extends java.lang.Object

(或等效的字节码)插入到类中。


4
投票
所有java类都隐式扩展java.lang.Object。来自

文档

Class

Object

 是类层次结构的根。每个类都有 
Object
 作为超类。所有对象(包括数组)都实现此类的方法。 

这里还有一个指向

JVM 规范的链接:

标准类

Object

 是所有其他类的超类 (§2.8.3)。 
Object
类型的变量可以保存对任何对象的引用,无论它是类的实例还是数组。所有类和数组类型都继承 Object 类的方法。 


1
投票
嗯,这可能是一个圆滑的答案(我最喜欢的类型),但如果您指定父级,它可能会以与派生类相同的方式进行操作。 如果你编写编译器,你不应该这样做吗?


0
投票
这是因为所有用户定义的类型都隐式继承自 Object。


0
投票
说 JVM 将属性或方法“注入”到类中,听起来像是编译器或运行时在事后所做的事情,就好像 .class

文件是不同的一样。实际上,所发生的只是当解析器发现您没有使用 extends 包含任何基类时,它只是假装您显式指定了

Object
。从那时起,编译器将其视为您自己输入的内容,并且 JVM 不知道您在源代码中指定或未指定什么。
    

© www.soinside.com 2019 - 2024. All rights reserved.