Java 整数不';你的行为不像一个真实的物体吗?
首先,我为我的英语感到抱歉。这不是我的主要语言Java 整数不';你的行为不像一个真实的物体吗?,java,function,Java,Function,首先,我为我的英语感到抱歉。这不是我的主要语言 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();
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 x = car.getInt();
x.setValue(9);
这就是使用Java的问题。
我喜欢java,但是C++中,我可以到处使用指针。
如果你想知道为什么我需要使用这个方法,那是因为我有以下两个函数:
private Rectangle2D.Double rect;
private Vector3D position;
rect.x
的值应与position.x
的值相同。
然后,每次我调整其中一个值时,我必须同时更改它们。
每个函数用于不同的方法。
我使用rect进行渲染,使用位置进行计算
多谢各位 在Java中,
Integer
类是,因此您永远无法更改它的一个实例的值。这就像通过设计,可以安全地共享相同的Integer
的许多实例。如果要修改x属性,必须为汽车提供setInt(Integer i)方法 根本问题是Integer
对象是不可变的。您需要做的是:
car.setInt(car.getInt() + 4);
代码中实际发生的情况如下所示:
Integer x = car.getInt();
这将获取对整数
对象的引用
x += 4;
这相当于这个
int temp = x.intValue();
int temp = temp + 4;
x = Integer.valueOf(temp);
换句话说,x+=4
正在创建一个新对象并将其分配给局部变量x
。该新对象没有被传回Car.x
实例变量
还有一些其他简单的解决方案:
- 去掉
局部变量,让x
方法直接在main
上操作。(这在风格上是有问题的,但无论如何,你的例子都很做作。)car.x
- 使用(可能编写)可变整数持有者类,而不是
。但是,这将意味着您将无法使用自动装箱/自动取消装箱;i、 e.integer
x+=4代码>将不再合法
。。。。我在寻找替代品。类似于x.setValue(9) 没有。原始包装器类型是不可变的。一套操作。。。或者任何违反“不可变性”不变量的行为都是不可能的1
严格地说,这是不正确的。有一种方法可以做到这一点。但是,如果您确实更改了
Integer
对象的“值”,就有很大的风险,您可能会破坏JVM中的所有其他内容。Integer
类特别实现了一种优化,通过这种优化,自动装箱可以重用现有的Integer
实例。因此,如果您设法将一个容纳8的整数
对象改为容纳9。。。你可以把很多其他的8改成9。哎哟 好吧,那么,它似乎回答了我的问题。但还有其他选择吗?@Nirock可能会创建自己的MutableInteger
?或者定义一个大小为1
的Integer[]
,您可以在0
索引处更改该值。但实际上,这似乎不是一个好主意——它闻起来像是一个设计问题。如果同一个整数碰巧在应用程序中共享,并且突然在所有使用它的地方改变了值,那么您将很难找到一个bugtrack@Nirock顺便问一下,为什么要使用整数
?最好使用一个普通的int
,必要时在类中编写一个setInt()
,以修改属性。我实际上不使用这个类。这只是为了让我头脑清醒。我认为整数是不可变的。通常不需要在int
上使用Integer
int
效率更高,也更不容易出错(无null
,==
比较有效,…),我想是这样的。在这之前,我认为我可以用前面描述的方式使用Integer。我仍然需要在两个对象上复制数据。矩形2D.Double,Vector3D并且不可能将同一个对象分配给它们(Vector3D
只接受基元Double
,所以根本没有对象)。无论何时您想要更改该值,都必须手动将其分配给这两个值。谢谢您提供的信息。事实上,我知道这件事,但我一直在寻找替代方案。类似于x.setValue(9);我真的很抱歉,我不能勾选2个答案。顺便说一句,这就是我想要它做的。我希望它将这个对象的所有实例都改为9而不是8;i、 不是整数。而且,您必须确保所有相关的Car
对象都引用了相同的(共享)整数持有者。