问题场景
123Object obj = new Integer(10);System.out.println(obj.getClass()); // 输出 class java.lang.IntegerInteger i = (Integer) obj; // 为什么必须强制转换?
明明obj的运行时类型是Integer,为什么赋值给Integer类型变量时需要强制转换?这与
Java
的编译时类型和运行时类型机制密切相关。
核心概念解析
1. 编译时类型 vs 运行时类型
编译时类型
运行时类型
定义
由变量声明决定
由实际创建的对象决定
作用阶段
编译阶段(静态检查)
运行阶段(动态绑定)
示例
Object obj → 类型为 Object
new Integer(10) → 类型为 Integer
2. 强制转换的本质
编译时承诺:告诉编译器"我知道这个对象的具体类型"
运行时验证:JVM
会检查实际类型是否匹配,否则抛出ClassCastExce ...