根据此Java运算符优先级和关联性表,成员访问的优先级高于new
运算符。
但是,给定一个类myClass
和一个非静态成员函数myFunction
,以下代码行是有效的:
< code >新的myClass()。my function();
如果在 new
之前评估 .
,如何执行此行?换句话说,为什么不需要括号?
< code >(新的myClass())。my function();
我的猜测是,因为()
与
中,首先计算
myClass()
,因此编译器甚至在计算
myClass
构造函数。然而,这似乎仍然意味着第一行应该与
new(myClass())相同。我的函数())
,但事实并非如此。
我不同意从杰克的图表中得出的结论。当一个语法被编写时,它的非终结符和结构被设计成实现被描述语言的优先性和结合性。这就是为什么经典的BNF for表达式引入了“term”和“factor”非终结符——在算术加法优先之前强制执行普通乘法。
因此,事实是“主要 -
在我看来,语法是Java运算符优先级和关联表不正确的证据。
这是因为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,以减少与