Los objetos en Java
La instanciación de las clases: Los objetos en Java a.) Referencias a Objeto e Instancias Los tipos simples de Java describian el dimension y los valores de las variables. Cada vez que se crea una clase se agrega otro tipo de dato que se puede utilizar idéntico 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 tambien con las instancias de subclases de su tipo. Del mismo modo que es adecuado 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 declaración 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. b.) Constructores Las clases pueden implementar un método especial llamado constructor. Un constructor es un método que comienza un objeto inmediatamente después de su creación. De esta manera nos evitamos el tener que comienzar las variables explícitamente para su comienzación. El constructor tiene exactamente el mismo nombre de la clase que lo implementa; no puede haber ningún otro método que comparta su nombre con el de su clase. Una vez definido, se llamará automáticamente al constructor al crear un objeto de esa clase (al utilizar el operador new). El constructor no devuelve ningún tipo, ni siquiera void. Su misión es empezar todo estado interno de un objeto (sus atributos), haciendo que el objeto sea utilizable inmediatamente; reservando memoria para sus atributos, iniciando sus valores... Por ejemplo: MiPunto( ) { inicia( -1, -1 ); } Este constructor denominado constructor por defecto, por no tener parametros, constituye el valor -1 a las variables de instancia x e y de los objetos que construya. El compilador, por defecto ,llamará al constructor de la superclase Object() si no se especifican parámetros en el constructor. Este otro constructor, sin embargo, recibe dos parámetros: MiPunto( int paraX, int paraY ) { inicia( paramX, paramY ); } La lista de parametros especificada despues del nombre de una clase en una sentencia new se emplea para pasar parametros al constructor. Se llama al método constructor justo después de crear la instancia y antes de que new devuelva el control al punto de la llamada. Asi, cuando ejecutamos el próximo programa: MiPunto p1 = new MiPunto(10, 20); System.out.println( "p1.- x = " + p1.x + " y = " + p1.y ); Se presenta en la pantalla: p1.- x = 10 y = 20 Para crear un proyecto Java que contenga ese codigo, se debe de crear una clase que contenga un metodo main(). El interprete java se ejecutara el metodo main de la clase que se le indique como parametro. Para mas informacion sobre como crear y ejecutar un programa, asi como los tipos de proyectos que se pueden crear en Java, vease el capitulo "II.12. Creacion de proyectos Java" de este tutorial. c.) El operador new El operador new crea una instancia de una clase (objetos) y devuelve una referencia a ese objeto. Por ejemplo: MiPunto p2 = new MiPunto(2,3); Este es un ejemplo de la creación de una instancia de MiPunto, que es controlador por la referencia a objeto p2. Hay una distincion apreciación entre la manera de manipular los tipos simples y las clases en Java: Las referencias a objetos realmente no contienen a los objetos a los que referencian. De esta manera se pueden crear multiples referencias al mismo objeto, como por ejemplo: MiPunto p3 =p2; Aunque tan sólo se creó un objeto MiPunto, hay dos variables (p2 y p3) que lo referencian. Cualquier cambio realizado en el objeto referenciado por p2 afectará al objeto referenciado por p3. La asignación de p2 a p3 no reserva memoria ni modifica el objeto. De hecho, las asignaciones posteriores de p2 simplemente desengancharán p2 del objeto, sin afectarlo: p2 = null; // p3 todavía apunta al objeto creado con new Aunque se haya asignado null a p2, p3 todavía apunta al objeto creado por el operador new. Cuando ya no haya ninguna variable que haga referencia a un objeto, Java reclama automaticamente la memoria utilizada por ese objeto, a lo que se designa recogida de basura. Cuando se realiza una instancia de una clase (mediante new) se reserva en la memoria un lugar para un conjunto de datos como el que determinan los atributos de la clase que se indica en la instanciacion. A este conjunto de variables se le designa variables de instancia. La potencia de las variables de instancia es que se obtiene un conjunto diferente de ellas cada vez que se crea un objeto nuevo. Es significativo el entender que cada objeto tiene su particular copia de las variables de instancia de su clase, por lo que los cambios sobre las variables de instancia de un objeto no tienen resultado sobre las variables de instancia de otro. El proximo proyecto crea dos objetos MiPunto y constituye los valores de x e y de cada uno de ellos de forma independiente para presentar que estan realmente separados. MiPunto p4 = new MiPunto( 10, 20 ); MiPunto p5 = new MiPunto( 42, 99 ); System.out.println("p4.- x = " + p4.x + " y = " + p4.y); System.out.println("p5.- x = " + p5.x + " y = " + p5.y); Este es el apariencia de salida cuando lo ejecutamos. p4.- x = 10 y = 20 p5.- x = 42 y = 99