You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java对象类型解析疑问:声明为Object的变量赋值true后为何实际类型为Boolean?

理解Java中的声明类型、实际类型与隐式继承

Great question! Let's unpack your confusion with two key concepts in Java: polymorphism (declared vs actual types) and implicit inheritance from Object.

1. 声明类型 vs 实际类型:多态的核心体现

在Java里,变量的声明类型(这里的Object)是编译器用来做静态类型检查的“壳子”,而变量实际指向的对象类型(这里的Boolean)才是运行时的真实实体。

当你写下:

Object obj = true;

这里发生了向上转型:true作为Boolean的字面量,会被自动装箱成Boolean对象,随后这个Boolean对象的引用被赋值给了Object类型的变量obj。虽然obj的声明类型是Object,但它本质上指向的是一个Boolean实例。

getClass()方法的作用就是返回对象的实际运行时类型,所以自然会输出java.lang.Boolean,而非声明的Object。举个更接地气的例子:

class Animal {}
class Dog extends Animal {}

Animal pet = new Dog();
System.out.println(pet.getClass()); // 输出 class Dog

逻辑完全一致——变量的声明类型只是个“容器”,装的是实际对象的引用,运行时的类型由真实对象说了算。

2. Boolean与Object的隐式继承关系

你注意到Boolean类没有显式写extends Object,这是因为Java中所有类默认都会隐式继承自Object类,根本不需要显式声明。

Java的类继承规则很明确:

  • 如果一个类没有显式继承任何其他类,编译器会自动为它补上extends Object的代码。
  • Object是所有Java类的根类,不管是普通类、枚举还是数组,都直接或间接继承自它。

所以Boolean类的实际编译后代码等价于:

public final class Boolean extends Object implements Serializable, Comparable<Boolean> {
    // 类内部实现
}

这也是为什么你能把Boolean对象赋值给Object类型变量的原因——Boolean是Object的子类,天然满足向上转型的条件。

总结一下

  • 声明类型是编译时的类型约束,实际类型是运行时对象的真实身份,getClass()返回后者,这是Java多态特性的核心表现。
  • 所有Java类都隐式继承自Object,哪怕没写extends Object,这是Java语言的默认规则。

内容的提问来源于stack exchange,提问作者GilbertS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 18:37:41