2011-10-25 97 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點。這種機制被稱爲自動裝箱。有一條簡單的經驗法則:爲了改變對象的狀態,而不是替換整個對象,你必須調用對象的一個​​方法。代表(如數字)的類相當常見,不是提供這樣的方法,而是要求將對象替換爲代表新值的新對象。