1 / 15

Conceptos más avanzados de Programación Orientada a Objetos

Conceptos más avanzados de Programación Orientada a Objetos. Programación 2005 Licenciatura de Lingüística y Nuevas Tecnologías. Objetivos de la clase. Entender los conceptos más avanzados de programación orientada a objetos (POO).

reilly
Download Presentation

Conceptos más avanzados de Programación Orientada a Objetos

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Conceptos más avanzados de Programación Orientada a Objetos Programación 2005 Licenciatura de Lingüística y Nuevas Tecnologías

  2. Objetivos de la clase • Entender los conceptos más avanzados de programación orientada a objetos (POO). • Si: poder navegar dentro de la estructura de la API de Java e encontrar la información buscada. • Si: entender el diseño de un programa que implementa estos conceptos. • Todavía no: implementar estos conceptos en sus propios programas. • Glosario: • Herencia y overriding: extends • Clase abstracta: abstract • Polimorfismo • Overloading, signature • Interfaz: interface, implements

  3. Herencia • Las clases en la API de Java están organizadas como un árbol, con Object como la clase raíz. Todas las demás clases son subclases (directas o indirectas) de Object. • Cualquiera nueva clase que creamos es automáticamente una sub-clase de Object. • Además de tener sus propios métodos y variables, las sub-clases (clases hijas/derivadas) heredan de todos los métodos y variables de su super-clase (clase madre/de base). • Podemos decir de una sub-clase que es una super-clase (relación is-a). Por ejemplo, un String es un Object, un Circulo es una FormaGeométrica. • La herencia es entre clases, no entre objetos!

  4. Herencia • Los métodos definidos por Object los heredan todas las clases. Algunos de ellos son: • boolean equals(Object obj)           Indicates whether some other object is "equal to" this one. • Class getClass()           Returns the runtime class of an object. getClass().getName() returns the name of the class as a String representation. •  String toString()           Returns a string representation of the object.

  5. Herencia • En GetNameExample.java, vemos como podemos llamar a GetName() para cualquier objecto de cualquiera clase (e.j., Number, Cohort). • El método toString() devuelve una representación textual de un objeto. Por ejemplo en UseToString.java, llamamos a c.toString() donde c es de tipo Cohort. Se imprime algo como: Cohort@82ba41 • Entonces, el método toString() no es muy útil si no se redefine. • El método equals(obj) dentro de Object compara las referencias de 2 objetos con ==. Por ejemplo: UseEquals.java • No obstante, muchas clases redefinen los métodos toString() y equals(obj) según sus necesidades. • Esta redefinición se llama overriding.

  6. Overriding • En la redefinición/overriding, el nombre del método y los argumentos de entrada son iguales. Solo el contenido del método cambia. • Por ejemplo, la clase String redefine el método equals(obj): no se limita a las referencias sino que averigua la igualdad de los contenidos (cadenas). • Cuando llamamos a equals(obj) para un objeto de tipo String, invocamos el método de la sub-clase String, no de la super-clase Object. • Las clases Integer, Double, Float, Short, Byte y Long, además de redefinir equals(obj), redefinen toString(). • Podemos también redefinir el método toString() e equals(obj) para la clase Alumno: Alumno.java

  7. La Herencia y la API de Java • En la documentación de la API de Java, se da para cada clase su posición en la jerarquia (cuales son sus super-clases) y sus subclases directas. Por ejemplo, la clase Number tiene como super-clase Object y como subclases directas (entre otras) Integer, Double, Float: http://java.sun.com/j2se/1.3/docs/api/java/lang/Number.html • Además del listado de los métodos de la clase, se proporciona aparta unas listas de los métodos heredados de cada super-clase. Por ejemplo, con FileWriter utilizamos el método void write(String s) de su super-clase indirecta Write: http://java.sun.com/j2se/1.3/docs/api/java/io/FileWriter.html • Como vemos en la API doc de FileWriter, la sintaxis de java para declarar que un método hereda de otro es: public class FileWriter extends OutputStreamWriter { .... } Con la palabra clave extends, declaramos que FileWriter hereda de OutputStreamWriter.

  8. Clases abstractas • La definición de la clase Number en la API de Java es la siguiente: public abstract class Number extends Object {...} • ¿Qué significa la palabra clave abstract ? • Una clase abstracta es una clase que nunca se puede instanciar. O sea que no podemos tener objetos del tipo de una clase abstracta. • No podemos tener objetos de tipo Number, pero si podemos instanciar objetos con las subclases de Number (que no son abstractas). Por ejemplo lo siguiente provoca un error de compilación: Number n = new Number(); java.lang.Number is abstract; cannot be instantiated • Una clase abstracta sirve para agrupar conceptualmente sub-clases y definir métodos y variables que hereden sus sub-clases.

  9. Clases abstractas • Una clase abstracta puede definir métodos abstractos. • Un método abstracto no tiene definición (o cuerpo). Les hereden las subclases de su clase, y cada una tiene que darle una implementación especifica, o sea redefinirla (overrides). • Un método abstracto se declara así (con el punto coma al final y sin llaves): abstract tipoDeStalida methodName(parametros-entrada); • La clase Number define los siguientes métodos abstractos: doubleValue() , floatValue() , intValue(), longValue(), shortValue(). • Estos métodos están redefinidos por obligación por las subclases de Number: Integer, Float, Double. Por ejemplo, podemos ver estos métodos en la API de Integer: http://java.sun.com/j2se/1.3/docs/api/java/lang/Integer.html

  10. Polimorfismo • Una variable de objeto puede referirse a diferentes tipos de objetos. Por ejemplo: • Object o1 = new Alumno(“Ron”,”Weasley”,6,5,’S’); • Object o2 = new String(“Hola”); • Object o3 = new Integer(3); • Number n = new Integer(4); • Si llamamos o1.toString() y o3.toString(), ¿Cuáles son los métodos llamados? • Para o1, el método toString() llamado es él de Alumno, pues o1 refiere a un objeto de tipo Alumno. • Para o3, el método toString() llamado es él de Integer, pues o3 refiere a un objeto de tipo Integer. • Esta capacidad de diferentes objetos de comportarse de diferentes formas con el mismo mensaje (i.e., método) se llama polimorfismo. • En este caso, hemos logrado el polimorfismo con la redefinición de los métodos (overriding).

  11. Polimorfismo • ¿En qué nos interesa el polimorfismo? Por ejemplo, podemos tener un ArrayList de objetos de tipo Number (es decir de sub-tipos Integer, Float, Double, etc). Podemos imprimir en bucle a cada uno de los objetos del ArrayList, convertiendo a cada uno con toString(), sabiendo, que se llamara al método toString() relevante para cada caso. Polimorfismo.java • Hemos conseguido polimorfismo con la redefinición (overriding) de un método. También podemos conseguir polimorfismo con lo que se llama overloading de métodos...

  12. Overloading • El nombre del método no es suficiente para identificar de manera única a un método dentro de una clase. También sirven el número y tipo de los argumentos de entrada. • El nombre de un método juntos con su argumentos de entrada se llama signature (firma), porque identifica de manera única a un método. • Por ejemplo, la clase String tiene dos métodos substring distintos (el segundo tiene un argumento extra): • public String substring(int beginIndex) • public String substring(int beginIndex,int endIndex) • Otro ejemplo: la clase Math tiene cuatro métodos con nombre max para devolver el máximo de dos numero, entre otros: • public static double max(double a, double b) • public static int max(int a, int b) • Esta habilidad de métodos (y constructores) a tener el mismo nombre pero a distinguirse por los argumentos de entrada se llama method overloading.

  13. Overloading • La clase java.io.PrintStream tiene varios métodos print() con signaturas diferentes: • public void print(boolean b) • public void print(char c) • public void print(char[] s) • public void print(float f) • public void print(double d) • public void print(int i) • public void print(long l) • public void print(Object obj) • public void print(String s) • Cuando escribimos: System.out.print(variable), el método llamado depende del tipo de variable. Esto es polimorfismo con overloading de método.

  14. Interfaz • Una interfaz define métodos como una clase, pero sin implementarlos (al contrario que una clase abstracta, no puede implementar n¡nguna). • Una interfaz no hace parte de la jerarquia de clases. Se define con la palabra clave interface: public interface Collection { ... } • Se dice que una clase implementa una interfaz y se utiliza la palabra clave implements. Por ejemplo: public class ArrayList ... implements List {...} • Una interfaz define un contrato que una clase que la implementa tiene que cumplir: es decir la clase tiene que implementar los métodos declarados en la interfaz. • Los contenedores de datos Collection, Map, List y Set son definidas como interfaces en la API de Java. Definen un conjunto de métodos (sin implementar) que cualquiera clase que los implementa tiene que definir.

  15. Interfaz • Los ventajas de una interfaz sobre una super-clase (abstracta) son al nivel del diseño: • No tenemos que forzar una jerarquía de clases si lo unico que queremos es que se cumpla algun contrato. Por ejemplo, queremos poder decir que un Coche (o una Casa) es un Bien Imponible si tener que decir que Coche es una subclase de BienImponible. • Como en Java no es posible heredar de más de una clase, usamos interfaces para describir propiedades adicionales de los objetos. Por ejemplo, un Coche es un Vehiculo (super-clase) pero también un Bien Imponible (interfaz que define las propiedades de los bienes imponibles) y un Productor de polución (interfaz que define las propiedades de los productores de polución).

More Related