Estigmatizados

La informática profesional no es un juego de políticos

Resultados de: ¿Cuánto sabemos de Java?

Cerramos la encuesta para valorar cuánto sabemos de Java, agradeciendo al “Sr. Francisco Ros” su atinada respuesta que una vez más nos demuestra por qué está donde está🙂

encuesta-01

Resultados

La opción mayoritariamente escogida es la de que Java pasa los tipos básicos por valor y el resto por referencia. Esto viene a demostrar -junto con ¿Quién quiere ser millonario?- que no siempre la opción más popular es la más correcta.

La solución es:

Java sólo permite el paso de parámetros por valor

Más información en: http://java.sun.com/docs/books/tutorial/java/javaOO/arguments.html

A diferencia de C/C++ no podemos indicar a otro método la dirección de una variable local para que este segundo método pueda modificar su contenido. El paso es siempre por valor; es decir: en la llamada se crean copias de las variables argumento y se copian sus valores.

En Java las variables pueden clasificarse según el tipo sobre el que se definen:

  • Tipos primitivos: int, char, long, …
  • Tipos referencia: Array, referencias a objetos (String), …

Lo anterior ¿quiere decir que cuando pasamos un objeto se copia todo el contenido del objeto? La respuesta es no, dado que los objetos nunca se pasan como argumentos; lo único que se pasa es la referencia al objeto. Esta referencia podemos verla como un smart pointer de C++, como una variable que simplemente guarda la dirección del objeto. Cuando en Java se pasa una referencia a objeto se crean copias de la variable referencia y se copia su valor: la dirección de memoria donde está el objeto.

Resumiendo:

El paso de parámetros en Java se realiza por valor, lo único que para objetos se pasan variables referencia por valor.

Experimento

Los excépticos pueden comprobar que la afirmación anterior es cierta probando el siguiente ejemplo:

public class TestArgPass {

	private static void concat(String origStr, String concatStr) {
		origStr = origStr + concatStr;
	}	

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		String origStr = "Hola ";
		String concatStr = "Mundo";

		concat(origStr, concatStr);

		System.out.println(origStr);
	}
}

Si el paso fuese por referencia origStr debería apuntar a un nuevo String formado por la concatenación de los literales “Hola ” y “Mundo”; en caso contrario origStr permanecería con el mismo valor que tenía antes de la llamada; es decir: apuntando a un objeto String con valor “Hola “.

agosto 21, 2009 - Posted by | Programación | , ,

Aún no hay comentarios.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: