Unidad 3 Programación Orientada a Objetos con Java. 3.1 Clases. En el mundo real encontramos muchos objetos del mismo tipo, por ejemplo, existen diferentes bicicletas de la misma marca y modelo. Cada una de ellas fue elaborada utilizando la misma plantilla o molde y por lo tanto cada una de ellas contiene los mismos componentes. Hablando en términos de la programación orientada a objetos, podemos decir que una bicicleta es una instancia u objeto de la clase Bicicleta. Una clase en java es una plantilla que contiene atributos y métodos que definen el estado y comportamiento de un objeto. En java, todo debe estar dentro de una clase. El archivo donde se almacena la clase debe de tener el mismo nombre que la clase con extensión .java Forma General de una clase en java. AccesoALaClase class NombreClase{ //atributos //metodos } Tipos de clases. abstract . Una clase abstract tiene al menos un método abstracto. Una clase abstracta no se instancia, sino que se utiliza como clase base para la herencia. final . Una clase final se declara como la clase que termina una cadena de herencia. No se puede heredar de una clase final. Por ejemplo, la clase Math es una clase final. public . Las clases public son accesibles desde otras clases, bien sea directamente o por herencia. Son accesibles dentro del mismo paquete en el que se han declarado. Para acceder desde otros paquetes, primero tienen que ser importadas. synchronizable . Este modificador especifica que todos los métodos definidos en la clase son sincronizados, es decir, que no se puede acceder al mismo tiempo a ellos desde distintos threads; el sistema se encarga de colocar los flags necesarios para evitarlo. Este mecanismo hace que desde threads diferentes se puedan modificar las mismas variables sin que haya problemas de que se sobreescriban. Existen diferentes formas de acceso a los miembros de las clases, en la siguiente tabla se muestran. Nivel de Acceso Modificador Clase Paquete Subclase Mundo public Y Y Y Y protected Y Y Y N no modifier Y Y N N private Y N N N Tabla 1 Modificadores de Acceso a los miembros de una clase. 3.2 Métodos. Los métodos son procedimientos definidos en una clase que contienen instrucciones y variables. Forma general de un método. modificadorAcceso tipoDeRetorno nombreMetodo(argumentos){ //declaraciones e instrucciones } La declaración de un método tiene 6 componentes. Modificador de Acceso. Por ejemplo puede ser público o privado o los que se encuentran en la Tabla 1. Este modificador indicará la forma en que otras clases pueden ver o no al método. Tipo de Retorno. El tipo de dato que regresará el método o void si no regresa nada. Nombre del Método Argumentos o parámetros enlistados entre paréntesis. Dentro de los paréntesis es la lista de argumentos delimitados por comas indicando primero el tipo de dato que es. Si no hay parámetros se ponen paréntesis vacíos (). Lista de excepciones. En caso de que no se desee hacer caso de las excepciones en este método, se indican todas las excepciones que se pueden presentar dentro del método. Cuerpo del método. El código de lo que realizara el método, incluyendo la declaración de variables. Todo dentro de {}. Ejemplo. void suma(int numero1,int numero1){ //cuerpo del metodo } Una de las características de java es la de mantener la encapsulación de los datos, esto se logra manteniendo los atributos privados. De esta forma solo utilizando los métodos de acceso adecuados podremos ver o establecer/modificar los valores de los atributos. A estos métodos se les llama en ingles accesors y mutators. Accesors. Son métodos de acceso a los atributos, se les llama getters, y la firma del metos es: acceso tipoRetorno nombreMetodo(); Generalmente el acceso es publico y siempre debe haber un tipo de retorno, ya que como la palabra lo indica, es para tener el acceso al atributo (para poder ver su valor). Mutators. Son métodos para modificar los valores de los atributos, se les llama setters, y la firma del método es: acceso void nombreMetodo(tipoAtributo nuevoValor); Generalmente el acceso es público y generalmente no existe el tipo de retorno. Este método se utiliza para establecer un nuevo valor para el atributo. Para invocar la llamada al un metodo se utiliza el . como se muestra a continuación: nombreObjeto.nombreMetodo(); En caso de que el método reciba parámetros se hace de la siguiente manera: nombreObjeto.nombreMetodo(param1,param2); 3.3 Constructores El constructor es un tipo específico de método que siempre tiene el mismo nombre que la clase y se utiliza para construir objetos de esa clase. No tiene tipo de dato específico de retorno, ni siquiera void. Esto se debe a que el tipo específico que debe devolver un constructor de clase es el propio tipo de la clase. En este caso, pues, no se puede especificar un tipo de retorno, ni se puede colocar ninguna sentencia que devuelva un valor. Los constructores pueden sobrecargarse, y aunque puedan contener código, su función primordial es inicializar el nuevo objeto que se instancia de la clase. Cuando se declara una clase en Java, se pueden declarar uno o más constructores opcionales (sobrecarga de métodos o polimorfismo) que realizan la inicialización cuando se instancia un objeto de dicha clase. class Persona { private String nombre; private String curp; private String fechaNacimiento; private float peso; //Constructores. public Persona(String nombre,String curp,String fechaNacimiento,float peso){ this.nombre=nombre; this.curp=curp; this.fechaNacimiento=fechaNacimiento; this.peso=peso; } public Persona(String nombre,float peso){ this.nombre=nombre; this.peso=peso; } //setters y getteres para cada atributo de la clase } En el ejemplo de Persona se declararon dos constructores, lo que hace la diferencia entre los dos, es la lista de argumentos o parámetros que le llega a cada uno de ellos. Por un lado esta el que recibe cuatro argumentos, igual cantidad que los atributos. Y el otro constructor solo recibe dos argumentos, uno String para el nombre y otro flotante para el peso. En Java, si no se proporciona explícitamente un constructor, el sistema proporciona uno por defecto que inicializará automáticamente todas las variables miembro a cero o su equivalente, en Java. 3.4 El recolector de basura. Se utiliza para liberar la memoria reservada. En ingles se llama garbage collector. Cuando ya no se necesita un objeto simplemente puede dejar de referenciarse. No existe una operación implícita para destruir un objeto o liberar el área de memoria utilizada por el. La liberación de memoria la realiza el recolector de basura, que es una función de baja prioridad de la JVM (java virtual Machine). La JVM determina en que momento se activara el recolector de basura. En ocasiones es necesario realizar alguna acción asociada antes de la liberación de memoria. Esto se puede realizar codificando el método finalize, se declara a continuación: protected void finalize() throws Throwable{} El método finalize es invocado por la JVM antes de liberar la memoria por el recolector de basura o antes de terminar la JVM. No existe un momento concreto en que las áreas de memoria son liberadas, sino que lo determina en cada momentos la JVM en función de sus necesidades de espacio. La forma de invocar al garbage collector es: System.gc(); Pero esto no es recomendado. 3.5 Miembros de clase estáticos Java tiene tres tipos de variables: de instancia de clase locales Las variables de instancia o miembros dato, se usan para guardar los atributos de un objeto particular. Las variables de clase o miembros dato estáticos son similares a las variables de instancia, con la excepción de que los valores que guardan son los mismos para todos los objetos de una determinada clase. En el siguiente ejemplo, PI es una variable de clase y radio es una variable de instancia. PI guarda el mismo valor para todos los objetos de la clase Circulo, pero el radio de cada círculo puede ser diferente class Circulo{ static final double PI=3.1416; double radio; double calcularArea(){ double area=PI*radio*radio; return area; } //... } Para indicar que el miembro PI es una variable de clase se le antepone el modificador static. El modificador final indica que es una constante que no se puede modificar, una vez que la variable PI ha sido inicializada Las variables locales se utilizan dentro de las funciones miembro o métodos. Como se puede ver en la declaración del método calcularArea(), area es una variable local a la función calcularArea en la que se guarda el valor del área de un objeto de la clase Circulo. Una variable local existe desde el momento de su definición hasta el final del bloque en el que se encuentra. De la misma forma que existen variables de instancia y variables de clase, existen los métodos de instancia y lo métodos de clase. Métodos de Clase. El lenguaje java soporta también métodos estáticos. Los métodos estáticos son los que definen la palabra reservada static en la declaración del método, y deben llamarse utilizando el nombre de la clase, sin la necesidad de crear una instancia de la clase, por ejemplo: NombreClase.nombreMetodo(args); 3.6 Herencia Java permite el uso de la herencia simple. La herencia se refiriere a que una clase puede obtener los atributos de otra clase, esto se hace con el fin de encontrar cosas comunes y generales, para después proporcionar estas características a otras clases y definir mas a detalle sus propias características. A la clase que da la herencia se le llama Superclase y a la que la recibe se le llama subclase. Por ejemplo, podemos crear una clase genérica Bicicleta, esta clase tendrá características comunes a todas las bicicletas. Esta clase puede heredar sus atributos a otras clases más especializadas como BicicletaMontaña o BicicletaVelocidad. Cada subclase además de las características comunes a todas las bicicletas, heredadas de Bicicleta, tendrá sus propios atributos específicos. Observe la figura, en ella podemos observar la superclase y las subclases derivadas. La forma de generar herencia es: public class subclase extends superclase { … } Ejemplo. public class Bicicleta { // la clase Bicicleta tiene 3 atributos public int cadence; public int gear; public int speed; // la clase Bicicleta tiene un constructor public Bicicleta(int startCadence, int startSpeed, int startGear) { gear = startGear; cadence = startCadence; speed = startSpeed; } // la clase Bicicleta tiene 4 metodos public void setCadence(int newValue) { cadence = newValue; } public void setGear(int newValue) { gear = newValue; } public void meterFreno(int decrement) { speed -= decrement; } public void aumentaVelocidad(int increment) { speed += increment; } } La clase BicicletaMontaña hereda los atributos de Bicicleta. public class BicicletaMontaña extends Bicicleta { // la subclase BicicletaMontaña agrega un campo public int seatHeight; // la subclase BicicletaMontaña tiene un constructor public BicicletaMontaña(int startHeight, int startCadence, int startSpeed, int startGear) { super(startCadence, startSpeed, startGear); seatHeight = startHeight; } // la subclass BicicletaMontaña agrega un metodo public void setHeight(int newValue) { seatHeight = newValue; } } En Java no se puede hacer herencia múltiple 3.7 Abstracción de Datos La abstracción de datos es obtener las partes esenciales de un objeto para crear una clase y generalmente se utilizan para generar herencia como superclase. Una clase abstracta puede tener o no atributos y puede tener o no métodos abstractos. Un método abstracto es un método que no tiene implementación como se muestra: abstract void moveTo(double deltaX, double deltaY); Si la clase incluye métodos abstractos, la misma clase debe ser declarada como abstracta, como se muestra a continuación. public abstract class ClaseAbstracta { // declaracion de campos // declaracion de metodos no abstractos // declaracion metodo abstracto abstract void dibujar(); } Las clases abstractas solamente se pueden usar como clases base para otras clases. No se pueden crear objetos pertenecientes a una clase abstracta. Sin embargo, se pueden declarar variables de dichas clases. 3.8 Polimorfismo. El concepto de Polimorfismo es uno de los fundamentos para cualquier lenguaje orientado a Objetos, las mismas raíces de la palabra pueden ser una fuerte pista de su significado: Poli = Multiple, morfismo= Formas , esto implica que un mismo Objeto puede tomar diversas formas. A través del concepto de Herencias es posible ilustrar este comportamiento El poder manipular un Objeto como si éste fuera de un tipo genérico otorga mayor flexibilidad al momento de programar con Objetos, vea el siguiente código: Figura a = new Circulo(); Figura b = new Triangulo(); Inicialmente se puede pensar que este código generaría un error debido a que el tipo de referencia es distinta a la instancia del objeto, sin embargo, el fragmento anterior es correcto y demuestra el concepto de Polimorfismo. Esto es posible debido a que Circulo y Triangulo son subclases de Figura. También podemos asociar el polimorfismo en la declaración de métodos con nombres igual y argumentos diferentes, como cuando declaramos múltiples constructores. Para ilustrar este concepto veamos el siguiente ejemplo. class Sumas{ // declaracion de atributos int numero1,numero2,resultado1; float numero3,numero4,resultado2; Complejo numero5,numero6,resultado3; //constructores public Sumas(int n1,int n2){ numero1=n1; numero2=n2 } public Sumas(float n1,float n2){ numero3=n1; numero4=n2 } public Sumas(Complejo n1,Complejo n2){ numero5=n1; numero6=n2 } // declaracion de metodos on el mismo nombre public int laSuma(int valor){ return valor+numero1; } public float laSuma(float valor){ return valor+numero3; } public Complejo laSuma(Complejo valor){ return valor+numero5; } } Podemos observar de la clase Suma, que existen 3 constructores, y cada uno de ellos recibe diferentes tipos de valores, esto hace que no haya confusión a la hora de invocar el constructor, java sabrá cual se esta invocando. También hay 3 métodos laSuma, y al momento de invocar cualquiera de los métodos java sabrá cual ejecutar debido a que recibirá el atributo de un tipo en particular. Bibliografia. 1. http://java.sun.com/docs/books/tutorial/java/javaOO/methods.html 2. http://www.ulpgc.es/otros/tutoriales/java/Cap1/instan.html 3. http://www.sc.ehu.es/sbweb/fisica/cursoJava 4.