Está en la página 1de 5

Objetos y referencias a objetos

No se puede declarar instancias de clases usando el nombre de la clase y un nombre para el objeto (como se hace en C++). La declaracin
ClassName ObjectName

crea solamente una referencia a un objeto de dicho tipo. Para crear un objeto dinmico en el montn se usa el operador new con el constructor del objeto deseado. El operador devuelve una referencia al objeto creado.
ClassName ObjectReference = new ClassName(...)

Slo si una clase no contiene ningn constructor Java propone un constructor por defecto que tiene el mismo modificador de acceso que la clase. Constructores pueden lanzar excepciones como cualquier otro mtodo. Para facilitar la construccin de objetos an ms, es posible usar bloques de cdigo sin que pertenezcan a constructores. Esos bloques estn prepuestos (en su orden de aparencia) delante de los cdigos de todos los constructores. El mismo mecanismo se puede usar para inicializar miembros estticos poniendo un delante del bloque de cdigo. Inicializaciones estticas no pueden lanzar excepciones.

static

class ... { ... static int[] powertwo=new int[10]; static { powertwo[0]=1; for(int i=1; i<powertwo.length; i++) powertwo[i]=powertwo[i-1]<<1; } ... }
Si una clase, por ejemplo, X, construye un miembro esttico de otra clase, por ejemplo, Y, y al revs, el bloque de inicializacin de X est ejecutado solamente hasta la aparencia de Y cuyos bloques de inicializacin recurren al X construido a medias. Nota que todas las variables en Java siempre estn en cero si todava no estn inicializadas explcitamente. No existe un operador para eliminar objetos del montn, eso es tarea del recolector de memoria incorporado en Java (diferencia con C++ donde se tiene que liberar memoria con delete explcitamente). Para dar pistas de ayuda al recolector se puede asignar null a una referencia indicando al recolector que no se va a referenciar dicho objeto nunca jams.

Las referencias que todava no acceden a ningn objeto tienen el valor null. Est permitida la conversin explcita de un tipo a otro mediante la reinterpretacin del tipo (``cast'') con todas sus posibles consecuencias. El ``cast'' es importante especialmente en su variante del ``downcast'', es decir, cuando se sabe que algn objeto es de cierto tipo derivado pero se tiene solamente una referencia a una de sus super-clases. Se puede comprobar el tipo actual de una referencia con el operador instanceof.
if( refX instanceof refY ) { ... } a.) Referencias a Objeto e Instancias

Los tipos simples de Java describan el tamao y los valores de las variables. Cada vez que se crea una clase se aade otro tipo de dato que se puede utilizar igual que uno de los tipos simples. Por ello al declarar una nueva variable, se puede utilizar un nombre de clase como tipo. A estas variables se las conoce como referencias a objeto. Todas las referencias a objeto son compatibles tambin con las instancias de subclases de su tipo. Del mismo modo que es correcto asignar un byte a una variable declarada como int, se puede declarar que una variable es del tipo MiClase y guardar una referencia a una instancia de este tipo de clase: MiPunto p; Esta es una declaracin de una variable p que es una referencia a un objeto de la clase MiPunto, de momento con un valor por defecto de null. La referencia null es una referencia a un objeto de la clase Object, y se podr convertir a una referencia a cualquier otro objeto porque todos los objetos son hijos de la clase Object.

Valores de retorno en mtodos de Java


En Java existe una serie de reglas para el retorno de valores en los mtodos. Resumidamente son:
1. En un mtodo que devuelve un objeto (de hecho, una referencia), se puede devolver null 2. Un array (o arreglo) es un tipo de retorno legal 3. Un mtodo con tipo de retorno void no devuelve nada! 4. En un mtodo que devuelve un tipo de dato primitivo, se puede devolver cualquier valor o variable que pueda ser implcitamente convertida hacia el tipo de retorno declarado 5. En un mtodo con un tipo de dato primitivo como retorno, se puede devolver cualquier valor o variable que pueda ser casteada hacia el tipo de retorno declarado 6. En un mtodo con un objeto como tipo de retorno, se puede devolver cualquier tipo de objeto que pueda ser implcitamente convertido hacia el tipo de retorno declarado y En un mtodo que devuelve un objeto (de hecho, una referencia), se puede devolver null

public }

Button return

metodo(){ null;

y Un array (o arreglo) es un tipo de retorno legal


public return } new String[] String[] metodo(){ {"hugo","paco","luis"};

y Un mtodo con tipo de retorno void no devuelve nada!


public } void inicializar(){ return;

y En un mtodo con un tipo de dato primitivo como retorno, se puede devolver cualquier valor o variable que pueda ser implcitamente convertida hacia el tipo de retorno declarado
public return } c; int char //devuelve Turno(){ 'c'; a int

c un char

= casteado

y En un mtodo con un tipo de dato primitivo como retorno, se puede devolver cualquier valor o variable que pueda ser casteada hacia el tipo de retorno declarado
public float return (int) f; } int f = Peso(){ 79.5f;

y En un mtodo con un objeto como tipo de retorno se puede devolver cualquier tipo de objeto que pueda ser implcitamente convertido hacia el tipo de retorno declarado
public return } new Figura Triangulo; getFigura(){ extends Figura

//Triangulo

Mensajes y mtodos El modelado de objetos no slo tiene en consideracin los objetos de un sistema, sino tambin sus interrelaciones. Mensaje. Los objetos interactan envindose mensajes unos a otros. Tras la recepcin de un mensaje el objeto actuar. La accin puede ser el envo de otros mensajes, el cambio de su estado, o la ejecucin de cualquier otra tarea que se requiera que haga el objeto. Mtodo.

Un mtodo se implementa en una clase, y determina cmo tiene que actuar el objeto cuando recibe un mensaje. Cuando un objeto A necesita que el objeto B ejecute alguno de sus mtodos, el objeto A le manda un mensaje al objeto B. Al recibir el mensaje del objeto A, el objeto B ejecutar el mtodo adecuado para el mensaje recibido. Llamar a Mtodos de un Objeto Llamar a un mtodo de un objeto es similar a obtener una variable del objeto. Para llamar a un mtodo del objeto, simplemente se aade al nombre del objeto referenciado el nombre del mtodo, separados por un punto (.), y se proporcionan los argumentos del mtodo entre parntesis. Si el mtodo no necesita argumentos, se utilizan los parntesis vacios. objetoReferenciado.nombreMtodo(listaArgumentos);
o

objetoReferenciado.nombreMtodo(); Veamos que significa esto en trminos de movimiento del rectngulo. Para mover rect a una nueva posicin utilizando el mtodo move() escribe esto. rect.move(15, 37); Esta sentencia Java llama al mtodo move() de rect con dos parmetros enteros, 15 y 37. Esta sentencia tiene el efecto de mover el objeto rect igual que se hizo en las sentencias anteriores en las que se moficaban directamente los valores x e y del objeto. rect.x = 15; rect.y = 37; Si se quiere mover un rectngulo diferente, uno llamado cubo, la nueva posicin se podra escribir. cubo.move(244, 47); Como se ha visto en estos ejemplos, las llamadas a mtodos se hacen directamente a un objeto especfico; el objeto especificado en la llamada al mtodo es el que responde a la instruccin. Las llamadas a mtodos tambin se conocen como mensajes. Como en la vida real, los mensajes se deben dirigir a un receptor particular. Se pueden obtener distintos resultados dependiendo del receptor de su mensaje. En el ejemplo anterior, se ha enviado el mensaje move() al objeto llamado rect para que ste mueva su posicin. Cuando se enva el mensaje move() al objeto llamado cubo, el que se mueve es cubo. Son resultados muy distintos.

Una llamada a un mtodo es una expresin (puedes ver Expresiones para ms informacin) y evala a algn valor. El valor de una llamada a un mtodo es su valor de retorno, si tiene alguno. Normalmente se asignar el valor de retorno de un mtodo a una variable o se utilizar la llamada al mtodo dentro del mbito de otra expresin o sentencia. El mtodo move() no devuelve ningn valor (est declarado como void). Sin embargo, el mtodo inside() de Rectangle si lo hace. Este mtodo toma dos coordendas x e y, y devuelte true si este punto est dentro del rectngulo. Se puede utilizar el mtodo inside() para hacer algo especial en algn punto, como decir la posicin del ratn cuando est dentro del rectangulo. if (rect.inside(mouse.x, mouse.y)) {
. . . // ratn dentro del rectngulo . . .

} else {
. . . // ratn fuera del rectngulo . . .

} Recuerda que una llamada a un mtodo es un mensaje al objeto nombrado. En este caso, el objeto nombrado es rect. Entonces. rect.inside(mouse.x, mouse.y) le pregunta a rect si la posicin del cursor del ratn se encuentra entre las coordenadas mouse.x y mouse.y. Se podra obtener una respuesta diferente si enva el mismo mensaje a cubo. Como se explic anteriormente, el objetoReferenciado en la llamada al mtodo objetoReferenciado.metodo() debe ser una referencia a un objeto. Como se puede utilizar un nombre de variable aqu, tambin se puede utilizar en cualquier expresin que devuelva una referencia a un objeto. Recuerda que el operador new devuelve una referencia a un objeto. Por eso, se puede utilizar el valor devuelto por new para acceder a las variables del nuevo objeto. new Rectangle(0, 0, 100, 50).equals(anotherRect) La expresin new Rectangle(0, 0, 100, 50) evala a una referencia a un objeto que se refiere a un objeto Rectangle. Entonces, como vers, se puede utilizar la notacin de punto (.) para llamar al mtodo equals() del nuevo objeto Rectangle para determinar si el rectanglo nuevo es igual al especificado en la lista de argumentos de equals().