2011-07-03 11 views
10

Mam pytanie.java Integer reference

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; } 

} 

Moim zdaniem przechodzącą int \ Integer As Integer do funkcji i podejmowania ++ tego odniesienia powinien zmienić podstawowy cel, ale wyjście jest 0 we wszystkich przypadkach. Dlaczego?

Odpowiedz

3

Jak wspomniano w innych odpowiedziach, Java ma tylko wartość wywoławcza, a operator ++ wywołuje tylko zmienną, a nie obiekt. Jeśli chcesz zasymulować wywołanie wywołanie-przez-odniesienie, musisz przekazać obiekt zmienny, taki jak tablica, i zmodyfikować jego elementy.

Interfejs API języka Java zawiera kilka specjalistycznych obiektów, takich jak java.util.concurrent.atomic.AtomicInteger (który dodatkowo działa również z wieloma wątkami) i org.omg.CORBA.IntHolder (używany do wywoływania wywołań zdalnych przez mechanizm CORBA).

ale można też po prostu zdefiniować własny zmienny całkowitą:

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 ahahahahahahahahahahah XD – user3063349

+0

tylko java wywołuje przez udostępnianie – user3063349

11

Większość klas takich jak Integer że wywodzą się z klasy abstrakcyjnej Number Java są niezmienne., To znaczy raz skonstruowane, mogą zawierać zawsze tylko ten konkretny numer.

Przydatną korzyścią jest to, że pozwala na buforowanie. Jeśli zadzwonisz:

Integer i = Integer.valueOf(n); 

dla -128 <= n < 127 zamiast:

Integer i = Integer.new(n) 

wrócisz do pamięci podręcznej obiektu, zamiast nowego obiektu. Oszczędza to pamięć i zwiększa wydajność.

W tym ostatnim przypadku testowego z nagim int argumentu, wszystko co widzisz jest jak zmienne Java są przekazywane przez wartośćzamiast przez odniesienie.

+0

dziękuję mężczyzna. Rozwiązałem sytuację. – OneMoreVladimir

+1

W rzeczywistości klasa 'Number' jest po prostu abstrakcyjna i bezpaństwowa - i istnieją podklasy, które * są zmienne * (AtomicInteger i AtomicLong są takimi, a także można zdefiniować nowe niestandardowe). –

+0

@Paulo dobry punkt - będzie edytować – Alnitak

5

@Alnitak -> poprawny. I dodać, co naprawdę się tutaj dzieje. +++ z powodu autoboxingu działa w ten sposób:

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

i val nie jest przechowywany w dowolnym miejscu, co powoduje utratę wartości.