Java类型转换报错:int无法转为c2,代码逻辑疑问求解
问题分析与解决
你遇到的问题核心是运算符优先级搞反了,不是类型转换没生效,而是你的写法根本没先做类型转换!
错误原因
在Java里,.(成员访问运算符)的优先级比强制类型转换运算符(类型)更高,所以你写的(c2)a.x会被JVM解读成:
- 先执行
a.x,拿到父类c1的x值(10,因为成员变量不参与多态) - 然后试图把这个int类型的10转换成
c2类型,这显然是不可能的,所以才会报incompatible type, int cannot be converted to c2的错误。
修正代码
你需要给强制类型转换加一层括号,确保先把父类引用a转换成子类c2类型,再访问它的成员变量x:
class c1 { int x = 10; } class c2 extends c1 { int x = 20; } class c3 { public static void main(String [] args) { c1 a = new c2(); System.out.println(a.x); // 输出10,因为成员变量看引用类型 System.out.println(((c2)a).x); // 先转类型再访问x,输出20 } }
额外补充:成员变量的多态误区
这里顺便提一下,Java的成员变量不支持多态:
- 当你用父类引用指向子类对象时,访问成员变量时,JVM会根据引用的编译时类型(也就是
c1)来查找变量,而不是对象的实际类型(c2),所以第一个System.out.println(a.x)输出的是c1的x=10。 - 只有成员方法才会根据对象的实际类型来动态调用(多态特性),成员变量没有这个特性哦。
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

