Escolar Documentos
Profissional Documentos
Cultura Documentos
3
Herencia
• Ejemplo 1: La clase Morpho tiene como subclases
Verb, Noun, etc.
Morpho.java , Noun.java ,Verb.java, Main.java
• La palabra clave extends permite definir una clase madre para
una subclase.
• Verb y Noun heredan de Morpho: heredan las variables de
instancia “lemma” y “category” e el método imprimir().
• Verb y Noun definen sus propias variables y métodos.
• EL constructor de Verb llama de forma explicita al constructor de
su super-clase con la palabra clave super.
• El constructor de Noun llama de forma implicita al constructor por
defecto de su super-clase.
• En el Main de Ejemplo 1, una variable de objeto de tipo Morpho
puede apuntar a cualquier objeto de tipo Morpho o de una sub- 4
clase de Morpho.
public class Verb extends Morpho {
String tense;
String person;
String number;
public class Morpho { String aspect;
String lemma;
String category; public Verb(String lemma,String tense,String person,String number,String aspect) {
super(lemma,"Verb");
public Morpho() { } this.tense = tense;
this.person = person;
public Morpho(String l,String c) { this.number = number;
lemma = l; this.aspect = aspect;
category = c; }
} }
thisNoun.imprimir();
thisVerb.imprimir();
Morpho thisMorpho = new Verb("ladra","present","third","singular","indicative");
thisMorpho.imprimir();
thisMorpho = new Morpho("el","Det");
thisMorpho.imprimir(); 5
}
}
Overriding
• Ejemplo 2: Las subclases pueden redefinir los
métodos de su superclase. Se llama overriding
Morpho.java , Noun.java ,Verb.java, Main.java
• Noun y Verb redefinen el método imprimir de Verb. Al
llamar el imprimir de un objeto de tipo Verb, se llama
el imprimir de Verb (y no al imprimir de Morpho).
6
public class Morpho { public class Verb extends Morpho {
String lemma; String tense;
String category; String person;
String number;
public Morpho() { } String aspect;
• Además del listado de los métodos de la clase, se proporciona las 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.4.2/docs/api/java/io/FileWriter.html
8
Clases abstractas
• Definición de la clase Number en la API de Java:
public abstract class Number extends Object {...}
• 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 sí 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 heredan sus sub-clases.
9
Métodos abstractos
• Una clase abstracta puede definir métodos abstractos.
• Un método abstracto no tiene definición (o cuerpo). Lo hereden las
subclases, 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 (overriden) 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
Clases y métodos abstractos
11
public abstract class Morpho {
String lemma;
String category;
public Morpho() {
thisNoun.imprimir();
thisVerb.imprimir();
12
Polimorfismo con Overriding
• Una variable de objeto puede apuntar a cualquier objeto de la clase
que le corresponde o de las sub-clases de esta clase. Por ejemplo,
partiendo del Ejemplo 3:
– Morpho morpho1= new Verb(....);
– Morpho morpho2= new Noun(....);
• morpho1.imprimir() llama al imprimir de Verb; morpho2.imprimir() llama al
imprimir de Noun.
• Esta capacidad de diferentes objetos de comportarse de diferentes
formas con el mismo mensaje (i.e., método) se llama polimorfismo.
13
Polimorfismo con Overriding
14
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.
15
Polimorfismo con Overloading
17
Interfaz
• Los ventajas de una interfaz sobre una super-clase (abstracta) son:
– No tenemos que forzar una jerarquía de clases si lo único que queremos es
que se cumpla algun contrato. Por ejemplo, queremos poder decir que un
Coche (o una Casa) es un Bien Imponible sin tener que decir que Coche es
una subclase de BienImponible.
– Como en Java no es posible tener más de una clase madre, 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 Objeto Polutante (interfaz que define las propiedades de los objetos
polutantes).
18