Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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_Function - Fatal编程技术网

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
    上操作。(这在风格上是有问题的,但无论如何,你的例子都很做作。)

  • 使用(可能编写)可变整数持有者类,而不是
    integer
    。但是,这将意味着您将无法使用自动装箱/自动取消装箱;i、 e.
    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
对象都引用了相同的(共享)整数持有者。