Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.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 理解作为实例的应用程序范围中的属性_Java_Jsp - Fatal编程技术网

Java 理解作为实例的应用程序范围中的属性

Java 理解作为实例的应用程序范围中的属性,java,jsp,Java,Jsp,我有两个JSP文件,每个文件都由不同的PC访问 在第一个示例中,我创建的对象类型为Integer: Integer var = 0; application.setAttribute("name_var", var); 在第二个示例中,我将获得之前创建的属性: var = (Integer) application.getAttribute("name_var"); 在这一点上,一切都很好。我在另一台PC中的第二个JSP中得到了我的值 由于Java是按值传递的,其中的值是references

我有两个JSP文件,每个文件都由不同的PC访问

在第一个示例中,我创建的对象类型为
Integer

Integer var = 0;
application.setAttribute("name_var", var);
在第二个示例中,我将获得之前创建的属性:

var = (Integer) application.getAttribute("name_var");
在这一点上,一切都很好。我在另一台PC中的第二个JSP中得到了我的值

由于Java是按值传递的,其中的值是references(),我想我在两个JSP文件中都有相同的实例(被不同的PC访问)

所以现在,当我修改我的var值时,它在另一边没有被修改,我不明白为什么

var++;
Output (in the JSP where the attribute was set): 0 (still)
有人能解释一下发生了什么事吗?每次修改对象的值时,是否必须使用
setAttribute
更新对象


提前感谢您

您需要将更改后的值设置回应用程序属性,而不仅仅是
var++

application.setAttribute("name_var", ++var);

原因是
Integer
对象的自动装箱和不变性。当您说
var++
时,java将
整数
解压为一个原语
int
,并将其递增。但是结果不会进入属性。

var++
不会更改存储在应用程序中的整数实例的内部状态。整数是不可变的。它的状态永远不会改变

该操作相当于

int tmp = var.intValue();
tmp = tmp + 1;
var = Integer.valueOf(i);
因此
var
现在引用的是另一个整数实例,而不是存储在应用程序中的实例

另一种方法是在应用程序中再次存储新值,或者在应用程序中存储线程安全的可变值:

AtomicInteger var = new AtomicInteger(0);
application.setAttribute("name_var", var);
...
var.incrementAndGet();

这里发生了一些奇怪的事情。不是开玩笑-为什么显示我回答了两次?@gknicker StackOverflow可能将答案计数存储为应用程序中的整数,并认为增加它会更改应用程序属性:)也感谢解释@gknicker感谢解释,以及AtomicInteger类。这将非常有用=)