当前位置: 首页 > 知识库问答 >
问题:

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

干浩然
2023-03-14

根据此Java运算符优先级和关联性表,成员访问的优先级高于new运算符。

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

< code >新的myClass()。my function();

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

< code >(新的myClass())。my function();

我的猜测是,因为() 中,首先计算 myClass(),因此编译器甚至在计算 keyword之前就知道正在调用带零参数的 myClass构造函数。然而,这似乎仍然意味着第一行应该与 new(myClass())相同。我的函数()),但事实并非如此。

共有2个答案

拓拔泉
2023-03-14

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

因此,事实是“主要 -

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

左博学
2023-03-14

这是因为Java语言的语法是如何定义的。当同一个词法序列可以用两种不同的方式解析时,运算符的优先级就会发挥作用,但事实并非如此。

为什么?

因为分配定义如下:

Primary: 
  ...
  new Creator

方法调用定义在:

Selector:
  . Identifier [Arguments]
  ...

两者都用在这里:

Expression3: 
  ...
  Primary { Selector } { PostfixOp }

所以发生的事情是

new myClass().myFunction();

解析为

         Expression
             |
             |
    ---------+--------
    |                |
    |                |
  Primary        Selector
    |                |
    |                |
 ---+---            ...
 |     |
new   Creator 

因此,无法根据优先级进行选择,因为Primary之前已减少。注意,在特殊情况下,比如

new OuterClass.InnerClass()

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

 类似资料:
  • 我有以下目标。我想调用不带括号的对象方法。 我该怎么做?

  • 问题内容: 谁能解释下面为什么在javascript中分配键的原因/方式? 返回: 问题答案: 这是新的ES2015(正式名称为ES6的EcmaScript规范)计算的属性名称语法。这是您从ES3/ 5知道的任务的简写: 是用于以下方面的语法糖:

  • 我hase测试类: 我想明白,怎么能叫: 将返回def的值。 有可能吗?

  • 问题内容: 我的用户库具有以下用于注册的代码 在我的mongooes模式中,我实现了中间件 得到以下问题 我的问题是:: 如何解决这个问题? 如何从mongooes中间件捕获错误到我的lib函数(捕获)? 问题答案: 似乎您没有使用Bluebird,但使用了mongoose promises(mpromise),它没有方法。 您可以通过解决此问题 在确定模型后使用, 使用投猫鼬承诺变成一个蓝鸟

  • 本文向大家介绍在Java中使用反射调用对象的方法,包括了在Java中使用反射调用对象的方法的使用技巧和注意事项,需要的朋友参考一下 可以使用java.lang.Class.getDeclaredMethods()方法调用对象的方法。此方法返回一个数组,其中包含具有公共,私有,受保护和默认访问权限的所有Method对象。但是,不包括继承的方法。 另外,如果类或接口没有方法,或者在Class对象中表示

  • 我很确定我以前做过这件事,所以我不知道为什么它现在会导致错误。这是我得到的错误: 它指向我定义新对象的位置,所以在静态上下文中不允许在方法调用中这样做吗?我需要定义一个变量并传入吗?因为那样会花更多的时间,而且会更加混乱。。。。 对于适当的上下文: 数组的类型为ArrayList Point是我定义的类。构造函数调用正确 p是Point的一个实例。它有两个字段:d0和d1(维度0和维度1,以减少与