整数不像真正的对象?

时间:2013-07-28 02:09:18

标签: 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();
        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进行渲染,然后使用位置来计算..

非常感谢!

3 个答案:

答案 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>