Está en la página 1de 8

El elemento bsico de la programacin orientada a objetos en Java es un clase. Una clase define la forma y el comportamiento de un objeto.

Cualquier concepto que desee representar en su programa en Java est encapsulado en una clase. En este captulo abordaremos en profundidad los conceptos tericos de la programacin orientada a objetos: encapsulado, herencia, y polimorfismo. Aprenderemos a crear, ampliar y crear instancias de nuestras propias clases y comenzaremos a utilizar la potencia real del estilo orientado a objetos de Java. Para crear una clase slo se necesita un archivo fuente que contenga la palabra clave class seguida de un identificador legal y un par de llaves para el cuerpo. class Point { } Las clases de Java tpicas incluirn variables y mtodos de instancia. Los programas en Java completos constarn por lo general de varias clases de Java de distintos archivos fuente. Una clase define la estructura de un objeto y su interfaz funcional, conocida como mtodos. Cuando se ejecuta un programa en Java, el sistema utiliza definiciones de clase para crear instancias de las clases, que son objetos reales. La forma general de una clase se muestra a continuacin.
class nombre_de_clase extends nombre_de_superclase { type variable_de_instancia1; type variable_de_instancia2; type variable_de_instanciaN; type nombre_de_mtodo1 (lista_de_parmetros) { cuerpo_del_mtodo; } type nombre_de_mtodo2 (lista_de_parmetros) { cuerpo_del_mtodo; } type nombre_de_mtodoN (lista_de_parmetros) { cuerpo_del_mtodo; } }

Aqu, nombre_de_clase y nombre_de_superclase son identificadores. La palabra clave extends se utiliza para indicar que nombre_de_clase ser una subclase de nombre_de_superclase. Hay una clase incorporada, llamada Object (objeto), que est en la raz de la jerarqua de clases de Java. Si se desea realizar una subclase de Object directamente, se puede omitir la clusula extends. Referencias a objeto Cada nueva clase que se crea aade otro tipo que se puede utilizar igual que los tipos simples. Por lo tanto, cuando se declara una nueva variable, se puede utilizar un nombre de clase como tipo. A estas variables se las conoce como referencias a objeto. A cada instancia se le puede llamar tambin objeto. Cuando se declara que el tipo de una variable es una clase, tiene como valor por omisin el null, que es una referencia al tipo Object, y, por lo tanto, es compatible en tipo con todas las otras clases. El objeto null no tiene valor; es distinto del entero 0, igual que el false de boolean. Este ejemplo declara una variable p cuyo tipo es de la clase Point.

Point p; Aqu la variable p tiene un valor null. Variables de instancia Los datos se encapsulan dentro de una clase declarando las variables dentro de las llaves de apertura y cierre de la declaracin de la clase. A las variables que se declaran en este mbito y fuera del mbito de un mtodo concreto se las conoce como variables de instancia. Este ejemplo declara una clase de nombre Point, con dos variables de instancia enteras llamadas x e y.
class Point { int x, y; }

El operador new El operador new crea una nica instancia de una clase y devuelve una referencia a ese objeto. Aqu se crea una nueva instancia de Point y se almacena en una variable p. Point p = new Point(); Aqu p referencia a una instancia de Point, pero realmente no lo contiene. Se pueden crear mltiples referencias al mismo objeto. Point p = new Point(); Point p2 = p; Cualquier cambio realizado en el objeto refernciado por p2 afectar al mismo objeto al cual se refiere p. La asignacin de p a p2 no asign memoria ni copi nada en el objeto original. De hecho las asignaciones posteriores a p simplemente desengancharn p del objeto original sin afectar al propio objeto, como se muestra a continuacin. Point p = new Point(); Point p2 = p; p = null; Aunque se haya asignado p a null, p2 todava apunta al objeto creado por el operador new. El operador punto (.) El operador punto se utiliza para acceder a las variables de instancia y los mtodos contenidos en un objeto. Esta es la forma general de acceder a las variables de instancia utilizando el operador punto. referencia_a_objeto.nombre_de_variable Aqu referencia_a_objeto es una referencia a un objeto y nombre_de_variable es el nombre de la variable de instancia contenida en el objeto al que se desea acceder. El siguiente fragmento de cdigo muestra cmo se puede utilizar el operador punto para almacenar valores en variables de instancia y para referirnos a estos.

p.x = 10; p.y = 20; System.out.println("x = " + p.x + " y = " + p.y); Declaracin de mtodo Los mtodos son subrutinas unidas a una definicin de una clase especfica. Se declaran dentro de una definicin de clase al mismo nivel que las variables de instancia. Se debe llamar a los mtodos en el contexto de una instancia concreta de esa clase. En la declaracin de los mtodos se define que devuelve un valor de un tipo concreto y que tiene un conjunto de parmetros de entrada.
tipo nombre_de_mtodo ( lista_formal_de_parmetros ) { cuerpo_del_mtodo; }

El nombre_de_mtodo es cualquier identificador legal distinto de los ya utilizados en el mbito actual. La lista_forma_de_parmetros es una secuencia de parejas de tipo e identificador separadas por comas. Si no se desean parmetros, la declaracin del mtodo deber incluir un par de parntesis vaco. Podramos crear un mtodo en nuestra clase Point que inicialice las variables de instancia que quedara de la forma siguiente:
clase Point { int x, y; void init(int x, int y) { this.x = x; this.y = y; } }

this En Java es ilegal declarar dos variables locales con el mismo nombre dentro del mismo mbito o uno que lo incluya. Observar que hemos utilizado x e y como parmetros para el mtodo init y en el interior del mtodo hemos utilizado un valor de referencia especial llamado this para referirnos directamente a las variables de instancia. Si no hubiramos utilizado this entonces x e y se hubieran referido al parmetro formal y no a las variables de instancia lo que se conoce como ocultar variables de instancia. El mtodo main() Dado que no hay funciones globales en Java, se deba idear alguna manera de iniciar un programa, de ah el sentido del mtodo main. Puesto que en otros lenguajes (p.e. C y C+ +) main se utilizaba a menudo para pasar parmetros desde la lnea de rdenes, un concepto perdido en los usuarios de interfaces de usuario grficas, el main de Java tambin pasa esos argumentos. El compilador de Java compilar clases que no tengan el mtodo main. El intrprete Java, sin embargo, no tiene ningn modo de ejecutar esas clases. El mtodo main es simplemente un lugar de inicio para que el intrprete comience. Un programa complejo tendr docenas de clases, y slo una de ellas necesitar tener un mtodo main. Para los applets (programas Java que estn incrustados en los visualizadores de red) no se utiliza

el mtodo main, ya que los visualizadores (o navegadores) de red siguen un convenio distinto para inicializar applets. Llamada a mtodo Se llama a los mtodos dentro de una instancia de un clase utilizando el operador punto (.). La forma general de una llamada: referencia_a_objeto . nombre_de_mtodo ( lista_de_parmetros ); Aqu, referencia_a_objeto es cualquier variable que se refiere a un objeto, nombre_de_mtodo es el nombre de un mtodo de la clase con la que se declar referencia_a_objeto y lista_de_parmetros es una lista de valores o expresiones separados por comas que coinciden en nmero y tipo con cualquiera de los mtodos declarados como nombre_de_mtodo en la clase. En este caso, podramos llamar al mtodo init sobre cualquier objeto Point. Point p = new Point(); p.init (10, 20); Constructores Las clases pueden implementar un mtodo especial llamado constructor. Un constructor es un mtodo que inicializa un objeto inmediatamente despus de su creacin. Tienen exactamente el mismo nombre de la clase en la que residen; de hecho no se puede tener ningn otro mtodo que comparta su nombre con su clase. Una vez definido, se llama automticamente al constructor despus de crear el objeto, antes de que termine el operador new. Como extensin a nuestro ejemplo Point, podemos inicializar las dos variables de instancia cuando construimos el objeto.
class Point { int x, y; Point(int x, int y) { this.x = x; this.y = y; } } class PointCreate { public static void main (String args[]) { Point p = new Point(10, 20); System.out.println("x = " + p.x + " y = " + p.y); } }

Se llama al mtodo del constructor justo despus de crear la instancia y antes de que new vuelva al punto de la llamada. Sobrecarga de mtodo Es posible y a menudo deseable crear ms de un mtodo con el mismo nombre, pero con listas de parmetros distintas. A esto se le llama sobrecarga de mtodo. Se

sobrecarga un mtodo siempre que se crea un mtodo en una clase que ya tiene un mtodo con el mismo nombre. Aqu presentamos una versin de la clase Point que utiliza sobrecarga de mtodo para crear un constructor alternativo.
class Point { int x, y; Point(int x, int y) { this.x = x; this.y = y; } Point() { x = -1; y = -1; } } class PointCreateAlt { public static void main (String args[]) { Point p = new Point(); System.out.println("x = " + p.x + " y = " + p.y); } }

Este ejemplo crea un objeto Point que llama al segundo constructor sin parmetros en vez de al primero. this en los constructores Un refinamiento adicional es que un constructor llame a otro para construir la instancia correctamente. A menudo es una buena idea crear constructores relacionados para que las clases puedan evolucionar con ms suavidad a lo largo del ciclo de desarrollo. Por ejemplo.
class Point { int x, y; Point(int x, int this.x = this.y = } Point() { this(-1, } }

y) { x; y; -1);

Herencia La herencia es un concepto que relaciona clases una encima de otra de un manera jerrquica. Esto permite que los descendientes de una clase hereden todas las variables y mtodos de sus ascendientes, adems de crear los suyos propios. A estos descendientes se les llama subclases. Al padre inmediato de una clase se le llama su superclase. En este ejemplo, extendemos la clase Point para que incluya un tercer componente llamado z.
class Point3D extends Point { int z; Point3D(int x, int y, int z) { this.x = x;

} Point3D() { this(-1, -1, -1); }

this.y = y; this.z = z;

La palabra clave extends se utiliza para indicar que se desea crear una subclase de Point. No se necesita declarar las variables x e y en Point3D porque se haban heredado de Point. Todas las variables x, y, z estn en el mismo mbito desde la perspectiva de una instancia de Point3D. super Hay una variable especial en Java llamada super, que se refiere directamente a los constructores de la superclase. Este ejemplo define una nueva versin de Point3D que utiliza el constructor super para inicializar x e y.
class Point3D extends Point { int z; Point3D(int x, int y, int z) { super(x, y); // aqu se llama al constructor Point(x, y) this.z = z; } }

Seleccin de mtodo dinmica Durante la ejecucin, la referencia a un objeto se puede referir a una instancia de alguna subclase del tipo de referencia declarado. En estos casos, Java utiliza la instancia real para decidir a qu mtodo llamar en el caso que la subclase sobrescriba el mtodo al que se llama. Por ejemplo, estas dos clases tienen una relacin subclase/superclase simple con un nico mtodo que se sobrescribe en la subclase.
class A { void callme() { System.out.println("En el mtodo callme de A"); } } class B extends A { void callme() { System.out.println("En el mtodo callme de B"); } } class Dispatch { public static void main(String args[]) { A a = new B(); a.callme(); } }

Hemos declarado que la variable es de tipo A y despus hemos almacenado ella una referencia a una instancia de la clase B. Cuando llamamos al mtodo callme de a, el compilador de Java verifica que realmente A tiene un mtodo llamado callme, pero el

interprete de Java observa que la referencia es realmente una instancia de B, por lo que llama al mtodo de B, en vez de al mtodo de A. Esta forma de polimorfismo dinmico durante la ejecucin es uno de los mecanismos ms poderosos que ofrece el diseo orientado a objetos para soportar la reutilizacin de cdigo y la robustez. final Todos los mtodos y las variables de instancia se pueden sobrescribir por defecto. Si se desea declarar que ya no se quiere permitir que las subclases sobrescriban las variables o mtodos, stos se pueden declarar como final. El modificador de tipo final implica que todas las referencias futuras a este elemento se basarn en esta definicin. Se puede utilizar final como modificador en declaraciones de mtodo cuando se desea no permitir que las subclases sobrescriban un mtodo concreto. finalize Por lo general, en Java, no hay que preocuparse por liberar memoria. Sin embargo, hay circunstancias en las que se podra desear ejecutar algn cdigo especial cuando el sistema de recogida de basura reclama un objeto. Se aade un mtodo a cualquier clase con el nombre finalize y el intrprete de Java llama al mtodo cuando vaya a reclamar el espacio de ese objeto. static A veces se desea crear un mtodo que se utiliza fuera del contexto de cualquier instancia. Todo lo que se tiene que hacer es declarar estos mtodos como static (esttico). Los mtodos estticos slo pueden llamar a otros mtodos static directamente, y no se pueden referir a this o super de ninguna manera. Las variables tambin se pueden declarar como static, pero debe ser consciente que es equivalente a declararlas como variables globales, que son accesibles desde cualquier fragmento de cdigo. Se puede declarar un bloque static que se ejecuta una sola vez si se necesitan realizar clculos para inializar las variables static. El ejemplo siguiente muestra una clase que tiene un mtodo static, algunas variables static y un bloque de inicializacin static.
class Static { static int a = 3; static int b; static void method(int x) { System.out.println("x = " + x); System.out.println("a = " + a); System.out.println("b = " + b); } static { System.out.println("bloque static inicializado"); b = a * 4; } public static void main(String args[]) { method(42); } }

Esta es la salida del programa.

bloque static inicializado x = 42 a=3 b = 12 abstract Hay situaciones que se necesita definir una clase que declara la estructura de una abstraccin dada sin promocionar una implementacin completa de cada mtodo. Se puede indicar que se necesita que ciertos mtodos se sobrescriban en subclases utilizando el modificador abstract. A estos mtodos se les llama a veces responsabilidad de subclase. Cualquier clase que contenga mtodos declarados como abstract tambin se tiene que declarar como abstract. No se pueden crear instancias de dichas clases directamente con el operador new, dado que su implementacin completa no est definida. No se pueden declarar constructores abstract o mtodos abstract static. Cualquier subclase de una clase abstract debe implementar todos los mtodos abstract de la superclase o ser declarada tambin como abstract.

También podría gustarte