Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中不带括号的新对象上调用方法:操作顺序冲突?_Java_Parsing_Operator Precedence - Fatal编程技术网

在Java中不带括号的新对象上调用方法:操作顺序冲突?

在Java中不带括号的新对象上调用方法:操作顺序冲突?,java,parsing,operator-precedence,Java,Parsing,Operator Precedence,根据,成员访问的优先级高于new运算符 但是,给定一个类myClass和一个非静态成员函数myFunction,以下代码行是有效的: newmyclass().myFunction() 如果在new之前对进行了评估,那么如何执行此行?换句话说,为什么不需要括号 (新的myClass()).myFunction() 我的猜测是,由于()与共享优先级,因此首先计算myClass(),因此编译器甚至在计算new关键字之前就知道正在调用具有零参数的myClass构造函数。然而,这似乎仍然意味着第一行应该

根据,成员访问的优先级高于
new
运算符

但是,给定一个类
myClass
和一个非静态成员函数
myFunction
,以下代码行是有效的:

newmyclass().myFunction()

如果在
new
之前对
进行了评估,那么如何执行此行?换句话说,为什么不需要括号

(新的myClass()).myFunction()


我的猜测是,由于
()
共享优先级,因此首先计算
myClass()
,因此编译器甚至在计算
new
关键字之前就知道正在调用具有零参数的
myClass
构造函数。然而,这似乎仍然意味着第一行应该与
new(myClass().myFunction())相同
为什么?

因为分配是在中定义的:

Primary: 
  ...
  new Creator
Selector:
  . Identifier [Arguments]
  ...
方法调用在中定义时:

Primary: 
  ...
  new Creator
Selector:
  . Identifier [Arguments]
  ...
这两种方法都在这里使用:

Expression3: 
  ...
  Primary { Selector } { PostfixOp }
那么会发生什么呢

new myClass().myFunction();
被解析为

         Expression
             |
             |
    ---------+--------
    |                |
    |                |
  Primary        Selector
    |                |
    |                |
 ---+---            ...
 |     |
new   Creator 
因此,根据优先级没有选择,因为
之前已减少。注意,对于特殊情况,如

new OuterClass.InnerClass()

类名实际上是在
new
操作符之前解析的,并且确实有规则来处理这种情况。如果你想看的话,请检查语法。

我不同意从杰克的图表中得出的结论。当编写语法时,它的非终结符和结构被设计为实现所描述语言的优先级和关联性。这就是为什么经典的BNF for表达式引入了“term”和“factor”非终结符,以强制执行算术加法优先级之前的正常乘法

因此,语法中的“Primary->newcreator”和“Expression->Primary Selector”意味着“newcreator”的优先级高于“Primary Selector”


在我看来,语法是Java运算符优先级和关联性表不正确的证据。

该表不是标准参考。你不能引用它作为证据。不要把话塞进我的嘴里。你知道我说了什么。您不能引用第三方网站作为Java中运算符优先级的证据。你也不能引用SO的答案,除非它引用或引用了规范性引用。在这种情况下,显然是第三方网站错了。我不知道我们为什么要讨论它。@EJP好吧,我误解了。我只是“把话塞进你的嘴里”,因为我试图更好地理解你在说什么(在这一点上,为什么你是这样一个混蛋)。“你不能引用它作为证据”这句话似乎暗示它作为参考资料是无效的。那么,你是说使用非规范性引用是可以的,但在问答中引用它们是不合适的?“非规范性”的意思是“作为引用源无效”。我没有声明在你的日常工作中以这种或那种方式使用这些资源,我也不会对此发表任何言论。我还要补充一点,在互联网及其前身的几十年中,我观察到每当一个问题开始时,你总是说“答案总是‘不’。@EJP奇怪的是,我经常重读这个讨论,每次它都让我感到困惑。我不知道我们为什么沟通这么困难,但我想这主要是因为我真的不知道你所说的“引用它作为证据”是什么意思;我并没有试图证明Java的行为(或应该行为)是以某种方式进行的。我只是在努力理解语言中让我感到困惑的一部分,我用这个链接解释了为什么我感到困惑。回答得好。谢谢你的图表!回答得很好。非常感谢。在上一个示例中,不是应该是:
newouterClass.NestedClass()
?我想你是想提到“静态”嵌套类。杰克的回答中,你不同意的一个特定前提似乎是“当同一个词法序列可以用两种不同的方式解析时,操作符的优先级才起作用”。事实上,有些语法在操作顺序上可能模棱两可,除了语法规范本身之外,还可能有一个优先表。但您似乎正确地认为,Java并非如此,因为:运算符之间的优先级由语法结果的层次结构管理。最低优先级的运算符是lambda表达式(->)的箭头,后面是赋值运算符。“引用此引号作为证据将改进您的答案。(我知道此引号来自规范的较新版本,因为当我提出此问题时,lambdas还没有在Java中引入。)