首先,我很抱歉我的英语。这不是我的主要语言。
class Car {
private Integer x;
public Car(){
this.x = new Integer(5);
}
public Integer getInt(){
return this.x;
}
public static void main(String[] args) {
Car car = new Car();
Integer x = car.getInt();
// Here is what annoying me. I want to change the value of car.x only with getInt()
x += 4;
system.out.println(""+car.x);
//This will print 5, when i want it to print 6.
}
}
这只是一个概念。我需要为我的项目更改Integer THIS方式的值。 这似乎是不可能的,但我可能会错过一些东西。
我的意思是,如果我能做到这样的事情,它会非常有用:
Integer x = car.getInt();
x.setValue(9);
这就是使用Java的问题。 我喜欢Java,但在c ++中我可以随处使用指针。
如果你想知道为什么我需要使用这种方法,那是因为我有这两个函数:
private Rectangle2D.Double rect;
private Vector3D position;
rect.x
应与position.x
具有相同的值。
然后,每当我调整其中一个值时,我都必须更改它们。
这些功能中的每一个都用于不同的方法。
我使用rect进行渲染,然后使用位置来计算..
非常感谢!
答案 0 :(得分:7)
在Java中,Integer
类是immutable,因此您永远无法更改其中一个实例的值。就像设计一样,可以安全地共享同一Integer
的许多实例。
答案 1 :(得分:1)
如果要修改x属性,则必须为Car提供setInt(Integer i)方法。
答案 2 :(得分:1)
根本问题是Integer
个对象是不可变的。你需要做的是:
car.setInt(car.getInt() + 4);
您的代码中实际发生的情况如下:
Integer x = car.getInt();
这将获得对Integer
对象的引用...
x += 4;
这相当于此。
int temp = x.intValue();
int temp = temp + 4;
x = Integer.valueOf(temp);
换句话说,x += 4
正在创建一个新对象并将其分配给局部变量x
。该新对象未被传回Car.x
实例变量。
还有其他一些替代解决方案:
摆脱x
局部变量,让main
方法直接在car.x
上运行。 (这在风格上是有问题的,但无论如何,你的例子非常人为。)
使用(可能写入)可变整数持有者类而不是Integer
。但是,这意味着不会能够使用自动装箱/自动拆箱;即x += 4;
将不再合法。
....我一直在寻找其他选择。类似于x.setValue(9);
没有一个。原始包装类型是不可变的。设定操作......或任何违反“不可变性”不变量的事物都不可能 1 。
1 - 严格来说,这是不正确的。 是一种方法。但是,如果您确实更改了Integer
对象的“值”,则存在很大的风险,即您将破坏JVM中的各种其他内容。 Integer
类特别实现了一种优化,即自动装箱重用现有的Integer
实例。所以,如果你设法改变一个持有8的Integer
对象来代替9 ......你可以将许多其他 8改为9.哎呀!!! < / p>