Una vez que se ha creado un objeto, probablemente querr�s hacer algo con �l. Sup�n, por ejemplo, que despu�s de crear un nuevo rect�ngulo, quieres moverlo a una posici�n diferente (es decir, el rect�ngulo es un objeto en un programa de dibujo y el usuario quiere moverlo a otra posici�n de la p�gina).
La clase Rectangle proporciona dos formas equivalentes de mover el rect�ngulo.
- Manipular directamente las variables x e y del objeto.
- Llamar el m�todo move().
La opci�n 2 se considera "m�s orientada a objetos" y m�s segura porque se manipulan las variables del objeto indirectamente a trav�s de una capa protectora de m�todos, en vez de manejarlas directamente. Manipular directamente las variables de un objeto se considera propenso a errores; se podr�a colocar el objeto en un estado de inconsistencia.
Sin embargo, una clase no podr�a (y no deber�a) hacer que sus variables estuvieran disponibles para la manipulaci�n directa por otros objetos, si fuera posible que esas manipulaciones situaran el objeto en un estado de inconsistencia. Java proporciona un mecanismo mediante el que las clases pueden restringir o permitir el acceso a sus variables y m�todos a otros objetos de otros tipos.
Esta secci�n explica la llamada a m�todos y la manipulaci�n de variables que se han hecho accesibles a otras clases. Para aprender m�s sobre el control de acceso a miembros puedes ir Controlar el Acceso a Miembros de una Clase.
Las variables x e y de Rectangle son accesibles desde otras clases. Por eso podemos asumir que la manipulaci�n directa de estas variables es segura.
�Referenciar Variables de un Objeto
Primero, enfoquemos c�mo inspeccionar y modificar la posici�n del rect�ngulo mediante la manipulaci�n directa de las variables x e y. La siguiente secci�n mostrar� como mover el rect�ngulo llamando al m�todo move().
Para acceder a las variables de un objeto, s�lo se tiene que a�adir el nombre de la variable al del objeto referenciado introduciendo un punto en el medio ('.').
objetoReferenciado.variable
Sup�n que tienes un rect�ngulo llamado rect en tu programa. puedes acceder a las variables x e y con rect.x y rect.y, respectivamente.
Ahora que ya tienes un nombre para las variables de rect, puedes utilizar ese nombre en sentencias y expresiones Java como si fueran nombres de variables "normales". As�, para mover el rect�ngulo a una nueva posici�n podr�as escribir.
rect.x = 15; // cambia la posici�n x rect.y = 37; // cambia la posici�n y
La clase Rectangle tiene otras dos variables--width y height--que son accesibles para objetos fuera de Rectangle. Se puede utilizar la misma notaci�n con ellas: rect.width y rect.height. Entonces se puede calcular el �rea del rect�ngulo utilizando esta sentencia.
area = rect.height * rect.width;
Cuando se accede a una variable a trav�s de un objeto, se est� refiriendo a las variables de un objeto particular. Si cubo fuera tambi�n un rect�ngulo con una altura y anchura diferentes de rect, esta instrucci�n.
area = cubo.height * cubo.width;
calcula el �rea de un rect�ngulo llamado cubo y dar� un resultado diferente que la instrucci�n anterior (que calculaba el �rea de un rect�ngulo llamado rect).
Observa que la primera parte del nombre de una variable de un objeto (el objetoReferenciado en objetoReferenciado.variable) debe ser una referencia a un objeto. Como se puede utilizar un nombre de variable aqu�, tambi�n se puede utilizar en cualquier expresi�n 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.
height = new Rectangle().height;
�Llamar a M�todos de un Objeto
Llamar a un m�todo de un objeto es similar a obtener una variable del objeto. Para llamar a un m�todo del objeto, simplemente se a�ade al nombre del objeto referenciado el nombre del m�todo, separados por un punto ('.'), y se proporcionan los argumentos del m�todo entre par�ntesis. Si el m�todo no necesita argumentos, se utilizan los par�ntesis vacios.
objetoReferenciado.nombreM�todo(listaArgumentos); o objetoReferenciado.nombreM�todo();
Veamos que significa esto en t�rminos de movimiento del rect�ngulo. Para mover rect a una nueva posici�n utilizando el m�todo move() escribe esto.
rect.move(15, 37);
Esta sentencia Java llama al m�todo move() de rect con dos par�metros 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 rect�ngulo diferente, uno llamado cubo, la nueva posici�n se podr�a escribir.
cubo.move(244, 47);
Como se ha visto en estos ejemplos, las llamadas a m�todos se hacen directamente a un objeto espec�fico; el objeto especificado en la llamada al m�todo es el que responde a la instrucci�n.
Las llamadas a m�todos tambi�n 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 posici�n.
Cuando se env�a el mensaje move() al objeto llamado cubo, el que se mueve es cubo. Son resultados muy distintos.
Una llamada a un m�todo es una expresi�n (puedes ver Expresiones para m�s informaci�n) y eval�a a alg�n valor. El valor de una llamada a un m�todo es su valor de retorno, si tiene alguno.
Normalmente se asignar� el valor de retorno de un m�todo a una variable o se utilizar� la llamada al m�todo dentro del �mbito de otra expresi�n o sentencia.
El m�todo move() no devuelve ning�n valor (est� declarado como void). Sin embargo, el m�todo inside() de Rectangle si lo hace. Este m�todo toma dos coordendas x e y, y devuelte true si este punto est� dentro del rect�ngulo.
Se puede utilizar el m�todo inside() para hacer algo especial en alg�n punto, como decir la posici�n del rat�n cuando est� dentro del rectangulo.
if (rect.inside(mouse.x, mouse.y)) {
. . .
// rat�n dentro del rect�ngulo
. . .
} else {
. . .
// rat�n fuera del rect�ngulo
. . .
}
Recuerda que una llamada a un m�todo 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 posici�n del cursor del rat�n se encuentra entre las coordenadas mouse.x y mouse.y. Se podr�a obtener una respuesta diferente si env�a el mismo mensaje a cubo.
Como se explic� anteriormente, el objetoReferenciado en la llamada al m�todo objetoReferenciado.metodo() debe ser una referencia a un objeto. Como se puede utilizar un nombre de variable aqu�, tambi�n se puede utilizar en cualquier expresi�n 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 expresi�n new Rectangle(0, 0, 100, 50) eval�a a una referencia a un objeto que se refiere a un objeto Rectangle.
Entonces, como ver�s, se puede utilizar la notaci�n de punto ('.') para llamar al m�todo equals() del nuevo objeto Rectangle para determinar si el rectang�lo nuevo es igual al especificado en la lista de argumentos de equals().