给出以下两个类:
class A {}
class B extends A {
int b;
}
基于以下运算符优先级表:http://www.cs.bilkent.edu.tr/~guvenir/courses/CS101/op_precedence.html。
两个运算符()
和.
的优先级相同,并且它们从左到右进行评估(关联性)。
A a = new B();
assert (B)a.b == 0;
以上代码片段应编译并成功声明,因为首先对括号运算符进行了评估(将引用a
转换为类型B
),然后访问强制转换引用的b
成员变量,该变量返回一个值0
。
为什么上面的陈述不是这样?
答案 0 :(得分:4)
您将优先级15的()
括号与优先级13的( type )
一元类型转换混淆。
优先级15的.
成员选择比强制类型转换高,因此(B)a.b
的意思是(B) (a.b)
,这就是为什么您需要编写{{ 1}}来获得想要的东西。
答案 1 :(得分:3)
这些括号是一元类型转换,其优先级低于.
成员选择。
Precedence Operator Type Associativity
---------- -------- ---- -------------
15 () Parentheses Left to Right
[] Array subscript
. Member selection
14 ++ Unary post-increment Right to left
-- Unary post-decrement
13 ++ Unary pre-increment Right to left
-- Unary pre-decrement
+ Unary plus
- Unary minus
! Unary logical negation
~ Unary bitwise complement
( type ) Unary type cast