Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.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 为什么非零返回int充当0?_Java_Class_Object_Methods - Fatal编程技术网

Java 为什么非零返回int充当0?

Java 为什么非零返回int充当0?,java,class,object,methods,Java,Class,Object,Methods,我一直在追踪,最后一个答案总是103,但当我运行程序时,答案是13。返回值未添加到methodThree中的t.sum中 我试着把线路改成 t.sum+=methodTwo()+7; 但答案是一样的。在执行这一行之前和之后,t.sum的值是12。为什么t.sum的值在此行中保持不变 类测试{ int x=2; int y=4; 整数和=6; 试验t; void methodOne(){ t=新测试(); t、 总和+=总和; 系统输出打印项次(t.sum); } int methodTwo()

我一直在追踪,最后一个答案总是103,但当我运行程序时,答案是13。返回值未添加到
methodThree
中的t.sum中

我试着把线路改成

t.sum+=methodTwo()+7;
但答案是一样的。在执行这一行之前和之后,t.sum的值是12。为什么t.sum的值在此行中保持不变

类测试{
int x=2;
int y=4;
整数和=6;
试验t;
void methodOne(){
t=新测试();
t、 总和+=总和;
系统输出打印项次(t.sum);
}
int methodTwo(){
System.out.println(++x);
方法一();
System.out.println(y++);
返回x*y*sum;
}
int methodThree(){
t、 sum+=methodTwo();
System.out.println(++t.sum);
回报——总和;
}
公共静态void main(字符串[]args){
测试t=新测试();
t、 方法一();
测试t2=新测试();
t2.方法一();
t2.方法三();
}
}

我同意这很棘手。
methodTwo
中的有趣之处在于
t
在调用
methodTwo
的过程中发生了变化。因此,当您在调用前后查看
t.sum
时,您看到的不是相同的
t
t
是如何改变的?当
methodTwo
调用
methodOne
时会发生这种情况,这反过来会创建一个新的
Test
对象并将其分配给
t


我们还需要知道在这种情况下通常的从左到右的评估意味着什么<代码>t.sum+=methodTwo()在某种意义上是从左到右计算的,在另一种意义上是从右到左计算的。我是什么意思?Java从左边开始,查看
t.sum
,并由此决定将方法结果添加到
t
在调用之前引用的对象中的
sum
。调用返回90,它被添加到旧的
t
对象中。正如我所说的,与此同时,一个新的
t
对象被创建,其
总和为12。因此,语句完成后,
t.sum
也是12。

这是使用调试器逐步完成程序的绝佳机会。相关:您确定您正在跟踪在
t
上更改的变量、在
t2
上更改的变量以及在
This
上更改的变量吗?因为根本不清楚你想做什么。
methodOne
的第一行是
t=newtest()
所以每次调用
methodOne
时都会丢弃当前的
t
。为什么
Test
包含
Test
的实例?请注意
methodOne
(被
methodTwo
调用)正在创建一个新实例并将其分配给
t
-因此
t.sum
在调用之后是另一个值,而在调用之前是另一个值(结果被添加到前一个值)。。。。(一个很好的永不写代码的示例)添加一个位,JLS描述了执行顺序-前两步:“首先,对左侧操作数求值以生成变量…”,“保存左侧操作数的值,然后对右侧操作数求值…”