2011-10-25 59 views
2

我知道,与以下,参考了Java - 引用原始数据类型?

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" 
    } 
} 
+1

相关:http://stackoverflow.com/questions/40480/is-java-pass-by-reference – BalusC

回答

3

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

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

要实现你想要的,你需要一个容器对象,它的值可以改变。

你可以,例如,使用AtomicInteger

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

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

在你的第二个代码块会发生什么事是,30被装箱成整数,并分配给x。然后你将同样的Integer分配给y。 x和y现在指向同一个对象。但是当你做y = 40时,那40被装箱到一个新的Integer对象中并被分配给y。 Integer类是不可变的,创建后将无法更改其值。

1

你不能。虽然Integer不是原始数据类型,但周围的int基本类型的包装类,你的代码就相当于:

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

所以你实际上改变的对象y点。这种机制被称为自动装箱。有一条简单的经验法则:为了改变对象的状态,而不是替换整个对象,你必须调用对象的一个​​方法。代表(如数字)的类相当常见,不是提供这样的方法,而是要求将对象替换为代表新值的新对象。