Java - 引用原语数据类型?

时间:2011-10-25 16:09:01

标签: java reference

我知道通过以下内容,可以参考

public class MyClass
{
  public Integer value;
}

public class Main
{
  public static void main( String[] args )
  {
    MyClass john = new MyClass();
    john.value = 10;
    MyClass bob = john;
    bob.value = 20;

    System.out.println(Integer.toString(john.value));  // Should print value of "20"
  }
}

但是,如何使用原始数据类型进行类似的引用?

public class Main
{
  public static void main( String[] args )
  {
    Integer x = 30;
    Integer y = x;
    y = 40;
    System.out.println(Integer.toString(x));  // Prints "30". I want it to print "40"
  }
}

3 个答案:

答案 0 :(得分:3)

简单回答:你没有。原始值总是按值传递(即复制它们)。

Integer之类的包装器对象也是不可变的,即y = 40将创建一个值为40的新Integer对象,并将其分配给y

要实现您的目标,您需要一个容器对象,其值可以更改。

例如,您可以使用AtomicInteger

AtomicInteger x = new AtomicInteger(30);
AtomicInteger y = x;
y.set( 40 );

System.out.println(x.get());

答案 1 :(得分:1)

你做不到。虽然Integer不是原始数据类型,而是围绕int基元类型的包装类,但您的代码等同于:

Integer y = x;
y = new Integer(40);

所以你实际上是将对象y更改为。此机制称为自动装箱。有一个简单的经验法则:为了改变对象的状态,而不是替换整个对象,你必须调用一个对象的方法。表示 values 的类(例如数字)通常不提供此类方法,而是要求将对象替换为表示新值的新对象。

答案 2 :(得分:0)

第二个代码块中发生的情况是30被装入整数并分配给x。然后将同一个整数分配给y。 x和y现在指向同一个对象。但是当你执行y = 40时,40会被装入一个新的Integer对象并被分配给y。 Integer类是不可变的,您将无法在创建后更改其值。