Punteros, referencias, alias y clones

¿Tiene punteros java?

Java no tiene punteros al estilo de otros lenguages de programación. Tiene referencias (en realidad punteros encubiertos) que es lo que realmente se pasa cuando se pasa in objeto.

Vamos a comprobarlo:

//PasarReferencias.java
public class PasarReferencias{
	static void f(PasarReferencias h){
		System.out.println("h dentro de f(): " + h );	
	}
	public static void main(String args[]){
		PasarReferencias p = new PasarReferencias();
		System.out.println("p dentro de main(): "+ p );
		f(p);
	}
}

Al intentar imprimir un objeto este saca por pantalla su nombre y su dirección de memoria.Por lo que obtenemos :

p dentro de main(): PasarReferencias@1a46e30

h dentro de f(): PasarReferencias@1a46e30

Si nos fijamos bien en la dirección de memoria (ese número feo después del @ ) nos fijamos que ambos son el mismo objeto. Ambas referencias apuntan al mismo objeto.

Uso de alias

Java nos permite usar alias para tener dos referencias apuntando al mismo objeto. Esto puede ser interesante pero peligroso. Ya que dos métodos pueden acceder al mismo objeto y cambiar nuestro objeto. Como era de esperar:

//Alias1.java
public class Alias1{
	int i;
	Alias1(int ii){ i=ii; }
	public static void main(String[] args){
		Alias1 x = new Alias1(3);
		Alias1 y = x;
		System.out.println("x: "+ x.i);
		System.out.println("y: "+ y.i);
		System.out.println("incrementando x");
		x.i++;
		System.out.println("x: "+ x.i);
		System.out.println("y: "+ y.i);
	}
}

La salida es la que cabía esperar:

x: 3
y: 3
incrementando x
x: 4
y: 4
 
java/70.txt · Última modificación: 2008/05/13 10:00 (editor externo)
 
Excepto donde se indique lo contrario, el contenido de esta wiki se autoriza bajo la siguiente licencia:CC Attribution-Noncommercial-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki