【发布时间】:2026-02-13 18:30:01
【问题描述】:
根据this table of Java operator precedence and associativity,成员访问的优先级高于new 运算符。
但是,给定一个类 myClass 和一个非静态成员函数 myFunction,以下代码行是有效的:
new myClass().myFunction();
如果. 在new 之前被评估,这行怎么执行?换句话说,为什么不需要括号?
(new myClass()).myFunction();
我的猜测是,由于() 与. 共享优先级,因此首先评估myClass(),因此编译器甚至在评估new 关键字之前就知道具有零参数的myClass 构造函数正在执行叫。但是,这似乎仍然暗示第一行应该与new (myClass().myFunction()); 相同,不是这种情况。
【问题讨论】:
-
该表不是标准参考。你不能引用它作为证据。
-
别把话塞进我嘴里。你知道我说了什么。您不能引用第三方网站作为 Java 中运算符优先级的证据。除非 它 引用或引用规范性参考,否则您也不能引用 SO 答案。在这种情况下,很明显是第 3 方站点出错了。我不知道我们为什么要讨论它。
-
@EJP 好吧,我误会了。我只是“把话放在你的嘴里”,因为我试图更好地理解你在说什么(以及在这一点上你为什么如此混蛋)。 “你不能引用它作为证据”的陈述似乎暗示它作为参考来源无效。所以你是说可以使用非规范性引用,但不能在 SO 问题和答案中引用它们?
-
'Non-normative' 表示 '作为参考来源无效'。我没有就在你的日常工作中以某种方式使用这些资源发表任何声明,我也不会对此说三道四。我要补充的是,几十年来,在互联网及其前身中,我观察到,每当一个问题开始时“所以你在说”,答案总是“不”。
-
@EJP 奇怪的是,我经常重读这个讨论,每次都让我大吃一惊。我不知道为什么我们很难沟通,但我想知道这是否很大程度上是因为我真的不知道你所说的“引用它作为证据”是什么意思。这不是法庭;我并没有试图证明 Java 以某种方式表现(或应该表现)。我只是在努力理解我发现困惑的语言的一部分,我使用链接来解释为什么我感到困惑。
标签: java parsing operator-precedence