在以下代码行中:
x = x.times(x).plus(y);
这些表达式将按什么顺序执行?
会是这样的:
x = (x + y)*x
或x = (x^2) + y
,
或其他什么,为什么?
有关特定主题的文档链接将受到高度赞赏,因为我的搜索没有运气。显然我不知道在哪里寻找和寻找什么。
谢谢。
答案 0 :(得分:7)
这些是方法;他们被称为“加号”和“时代”这一事实并不意味着他们必须遵循内置+
和*
运营商的行为。
首先执行x.times(x)
。这将返回对象的引用,然后将执行plus(y)
。然后将其返回值分配给x
。它相当于:
tmp = x.times(x);
x = tmp.plus(y);
答案 1 :(得分:2)
这是一个link to a documentation ,最有可能包含所需的答案(可能是15.7)。这是高度技术性和冗长的,但大多数人都无法访问(我相信)。
然而,似乎你刚刚开始编程,所以你最好在这里阅读其他答案,并编程更多以获得直观的感觉(不完全是'感觉',因为它是系统的和严谨的)经营秩序等...
如果您不知道在哪里寻找答案,请不要害怕编写“丢弃”代码(您可以偶然保存代码)以找出您不知道的内容。您可以随时更深入地谷歌搜索,或者在后一天浏览语言规范。你会用这种方式学得更快。 :)
找出一个简单的方法就是写下这样的东西:
class Number{
private int number;
public Number(int x){
number = x;
}
public Number times(Number x){
System.Out.PrintLn("times");
return number * x;
}
public Number plus(Number x){
System.Out.PrintLn("plus");
return number + x;
}
}
答案 2 :(得分:1)
方法链从左到右执行,每个方法都使用前一个方法的结果,因此它将是x = (x^2) + y
。
答案 3 :(得分:1)
在代数表达式中你所指的是运算符优先级 - 例如,在加法之前评估乘法。 Java编译器知道表达式的这些规则,并将生成代码以按预期评估它们。
对于方法调用,没有“特殊规则”。当给定x = x.times(x).plus(y);
时,编译器只知道要评估x.times(x).plus(y)
,它首先需要知道x
是什么,因此它可以在其上调用times
。同样,它需要知道x.times(x)
是什么,因此它可以在该结果上调用plus
方法。因此,这种类型的语句从左到右解析:(x * x)+ y。
某些语言允许创建具有用户提供的优先级的“中缀”功能。 (例如Haskell:参见http://www.haskell.org/tutorial/functions.html,“Fixity声明”部分)。唉,唉,不是其中之一。
答案 4 :(得分:0)
它将以从左到右的顺序执行,如
x = (x.times(x)).plus(y)
另一种方式:
x = x.(times(x).plus(y))
对我来说甚至没有意义。您必须将其重写为
x = x.times(x.plus(y))
理解它,但第二个x
包含在times()
y
而{{1}}位于其外的事实排除了该解释。
答案 5 :(得分:0)
文档没有说明这一点的原因可能是这些表达式遵循如何评估a.b().c().d()
之类的语句的正常规则:从左到右。我们从a
开始,并在其上调用函数b()
。然后,我们就该调用的结果调用c()
,并在d()
的结果上调用c()
。因此,x.times(x).plus(y)
将首先执行乘法,然后执行加法。