2011-07-03 19 views
10

Tengo una pregunta.java Referencia entera

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

} 

A mi modo de pasar un int \ Entero como entero a una función y hacer ++ en que la referencia debe cambiar el objeto subyacente, pero la salida es 0 en todos los casos. ¿Porqué es eso?

Respuesta

3

Como se dijo en las otras respuestas, Java solo hace call-by-value, y el operador ++ solo afecta una variable, no un objeto. Si desea simular llamada por referencia, deberá pasar un objeto mutable, como una matriz, y modificar sus elementos.

La API de Java tiene algunos objetos especializados para esto, como java.util.concurrent.atomic.AtomicInteger (que también funciona también en varios subprocesos) y org.omg.CORBA.IntHolder (usado para llamada remota por llamadas remotas mediante el mecanismo CORBA).

Pero también puede simplemente definir su propio número entero mutable:

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 solo llama por compartir – user3063349

11

La mayoría de las clases, tales como Integer que se derivan de la clase abstracta de Java Number son inmutables ., Es decir, una vez construidos, pueden solamente siempre contienen ese número en particular.

Una ventaja útil de esto es que permite el almacenamiento en memoria caché . Si llama:

Integer i = Integer.valueOf(n); 

para -128 <= n < 127 en lugar de:

Integer i = Integer.new(n) 

a recuperar un objeto almacenado en caché, en lugar de un nuevo objeto. Esto ahorra memoria y aumenta el rendimiento.

En el caso de prueba último con una int argumento desnudo, todo lo que se está viendo es cómo se transmiten las variables de Java por valor en lugar de por referencia .

+0

Muchas gracias hombre. He aclarado la situación. – OneMoreVladimir

+1

En realidad, la clase 'Number' simplemente es abstracta y sin estado, y hay subclases que * son mutables * (AtomicInteger y AtomicLong son tales, y uno también podría definir nuevas personalizadas). –

+0

@Paulo buen punto - editará – Alnitak

5

@Alnitak -> correcto. Y para agregar lo que realmente sucede aquí. La ++ i debido a las obras que autoboxing como:

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

y Val no se almacena en cualquier lugar, por lo tanto se pierde la subasta.