Java对象类型解析疑问:声明为Object的变量赋值true后为何实际类型为Boolean?
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

