gpt4 book ai didi

java - 为什么这个 Java 程序没有显示我期望的结果?

转载 作者:行者123 更新时间:2023-12-04 23:42:49 25 4
gpt4 key购买 nike

这是我的代码:

/* User: koray@tugay.biz Date: 21/02/15 Time: 19:53 */

public class DriverClass {

public static void main(String[] args) throws InterruptedException {

int upper = 15;
Integer sumValue = null;
Thread thread = new Thread(new Summation(upper, sumValue));
thread.start();
thread.join();
System.out.println(sumValue);

}

}

和求和类:

class Summation implements Runnable {

private int upper;
private Integer sumValue;

public Summation(int upper, Integer sumValue) {
this.upper = upper;
this.sumValue = sumValue;
}

public void run() {
System.out.println("Thread started...");
int sum = 0;
for (int i = 0; i <= upper; i++) {
sum += i;
}
System.out.println("Sum is:" + sum);
sumValue = sum;
}

}

我会在控制台看到:

Thread started...
Sum is:120
null

为什么最后一行是'null'?我期待再次看到 120?

最佳答案

好的。我用一张图解释一下。首先,您在 main 方法中创建一个引用并将 null 分配给它:

main
----
sumValue -----> null

然后将此引用传递给 Summation 构造函数。这将创建引用的副本:

main
----
sumValue -----> null
^
Summation |
---- |
sumValue --------

然后 Summation.run() 方法将一个新的整数值分配给 Summation.sumValue 引用:

main
----
sumValue -----> null

Summation
----
sumValue -----> 120

如您所见,main 方法中的引用仍然指向 null。这就是打印 null 的原因。

相反,您可以做的是传递对可变对象的引用,该对象的状态可以改变(例如 AtomicInteger):

main
----
sumValue -----> AtomicInteger(0)

然后将其传递给求和:

main
----
sumValue -----> AtomicInteger(0)
^
Summation |
---- |
sumValue --------

然后在Summation中,修改AtomicInteger的状态:sumValue.set(120):

main
----
sumValue -----> AtomicInteger(120)
^
Summation |
---- |
sumValue --------

然后,当在 main 方法中打印 AtomicInteger 时,您将得到 120,因为 main 方法和 Summation 对象有两个指向同一个对象的引用。

或者更好的是,您可以将结果作为 Integer 存储在 Summation 对象中,并在计算完成后在 main 方法中请求结果:

System.out.println(summation.getSumValue());

关于java - 为什么这个 Java 程序没有显示我期望的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28649247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com