Java 不带双括号的强制转换引用变量
鉴于以下两类:Java 不带双括号的强制转换引用变量,java,Java,鉴于以下两类: class A {} class B extends A { int b; } 基于以下运算符优先级表: 两个操作符()和具有相同的优先级,它们从左到右求值(关联性) 当首先计算圆括号操作符时(将引用a转换为类型B),然后访问转换引用的B成员变量,该变量返回值0,上述代码段应该编译并成功断言 为什么上面的语句不是这样?这些括号是一元类型转换,其优先级低于成员选择 优先运算符类型关联性 ---------- -------- ----
class A {}
class B extends A {
int b;
}
基于以下运算符优先级表:
两个操作符()
和
具有相同的优先级,它们从左到右求值(关联性)
当首先计算圆括号操作符时(将引用a
转换为类型B
),然后访问转换引用的B
成员变量,该变量返回值0
,上述代码段应该编译并成功断言
为什么上面的语句不是这样?这些括号是一元类型转换,其优先级低于
成员选择
优先运算符类型关联性
---------- -------- ---- -------------
15()括号从左到右
[]数组下标
. 成员选择
14++从右到左的一元后置增量
--一元后减量
13++从右到左的一元预增量
--一元预减量
+一元加号
-一元负号
! 一元逻辑否定
~1元按位补码
(类型)一元类型转换
您将优先级15中的()
括号与优先级13中强制转换的(类型)
一元类型混淆了
优先级为15的
成员选择高于类型转换,因此(B)a.B
意味着(B)(a.B)
,这就是为什么您需要编写((B)a.B
以获得所需内容的原因
A a = new B();
assert (B)a.b == 0;