2011-07-03 37 views
10

我有一個問題。Java的整數參考

public class Jaba { 

    public static void main(String args[]) { 
     Integer i = new Integer(0);   
     new A(i); 
     System.out.println(i); 
     new B(i); 
     System.out.println(i); 
     int ii = 0;   
     new A(ii); 
     System.out.println(ii); 
     new B(ii); 
     System.out.println(ii);  
    } 

} 

class A { 

    public A(Integer i) { ++i; } 

} 

class B { 

    public B(int i) { ++i; } 

} 

依我看傳遞一個int \整數作爲整型到功能並使++對參考應該改變底層對象,但輸出是在所有情況下0。這是爲什麼?

回答

3

正如在其他答案中所說的,Java只能按值調用,而++運算符隻影響變量而不是對象。如果您想模擬以引用方式調用,則需要傳遞可變對象,如數組,並修改其元素。

Java API爲此提供了一些專用對象,如java.util.concurrent.atomic.AtomicInteger(也可用於多線程)和org.omg.CORBA.IntHolder(用於CORBA機制的遠程調用的引用調用)。如果您想使用引用參數那就試試這個

class MutableInteger { 
    public int value; 
} 


class C { 
    public C(int[] i) { 
     ++i[0]; 
    } 
} 
class D { 
    public D(MutableInteger i) { 
     ++i.value; 
    } 
} 
class E { 
    public E(AtomicInteger i) { 
     i.incrementAndGet(); 
    } 
} 
public class Jaba { 
    public static void main(String args[]) { 

     int[] iii = new int[]{ 0 }; 
     System.out.println(iii[0]); 
     new C(iii); 
     System.out.println(iii[0]); 
     MutableInteger mi = new MutableInteger(); 
     System.out.println(mi.value); 
     new D(mi); 
     System.out.println(mi.value); 
     MutableInteger ai = new AtomicInteger(0); 
     System.out.println(ai); 
     new E(ai); 
     System.out.println(ai); 
    } 
} 
+0

ahahahahahah ahahahahahaha ahahahahahahahahahahahah XD – user3063349

+0

java只能通過共享 – user3063349

11

大多數類如Integer從Java的抽象Number類派生的是不變,即一旦建立,他們永遠只能包含特定數量。

這方面的一個有用的好處是,它允許緩存。如果您致電:

Integer i = Integer.valueOf(n); 

-128 <= n < 127代替:

Integer i = Integer.new(n) 

你回來緩存的對象,而不是一個新的對象。這可以節省內存並提高性能。

在後面的測試案例與裸int的說法,所有你看到的是如何Java的變量是按值而不是引用傳遞

+0

感謝很多人。我已經清理了這種情況。 – OneMoreVladimir

+1

實際上,'Number'類簡單地是抽象的和無狀態的 - 並且有可變的子類*(AtomicInteger和AtomicLong是這樣的,而且還可以定義新的自定義類)。 –

+0

@Paulo好點 - 將編輯 – Alnitak

5

@Alnitak - >正確。並添加真正在這裏發生的事情。由於自動裝箱的++我這樣工作:

int val = Integer.intValue(); ++val; 

和val沒有存儲在任何地方,因此增量會丟失。