Logo Studenta

clase 3-herencia - clases abstractas - polimorfismo

¡Este material tiene más páginas!

Vista previa del material en texto

Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Taller de Lenguajes II
Temas de hoy:
• Herencia
− Definición
− La cláusula extends
− Sobreescritura
− La clase Object. Los métodos equals() y toString() 
• Clases abstractas y métodos abstractos
− Definición
− La palabra clave abstract
• Polimorfismo
– Definición
– Binding Dinámico
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Herencia
"es el mecanismo que permite definir una clase de objetos 
tomando como base la definición de otra clase"
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Herencia
La programación orientada a objetos permite a las clases expresar 
similitudes entre objetos que tienen características y comportamiento 
común. Estas similitudes pueden expresarse usando herencia. El 
término herencia se refiere al hecho que una clase hereda los 
atributos (variables) y el comportamiento (métodos) de otra clase.
calzado
vestimenta
remera
color
precio
número tipo_mang
a
Una de las contribuciones más 
interesantes de la herencia es la 
flexibilidad que proporciona para 
capturar y aprovechar al máximo las 
características comunes de diferentes 
clases de objetos. 
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Herencia
Ejemplo
Si tenemos que modelar la clase:
- ¿Cómo la modelaríamos?
- ¿Cuáles serían sus atributos?
número - marca 
- ¿Cuál sería su comportamiento?
sonar – llamar
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Si tenemos que modelar la clase:
 - ¿Cómo la modelaríamos?
 - ¿Cuáles serían sus atributos?
número - marca - antena
 - ¿Cuál sería su comportamiento?
 sonar – llamar 
 enviar mensajes
Herencia
Ejemplo
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Si tenemos que modelar la clase:
- ¿Cómo la modelaríamos?
- ¿Cuáles serían sus atributos?
número - marca - ubicación
- ¿Cuál sería su comportamiento?
 recibir crédito – llamar 
 controlar crédito
Herencia
Ejemplo
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Cada uno de estos tipos de teléfonos tienen 
“características y comportamiento común”. 
Podemos observar claramente que tanto la 
clase Teléfono Celular como Teléfono Público 
heredan atributos y comportamiento de la clase 
Teléfono.
Herencia
Ejemplo
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
ClaseA
(clase base o superclase)
ClaseB
(clase derivada o subclase)
Diagrama de clases con herencia
La clase ClaseA es la superclase de la clase ClaseB
La clase ClaseB es subclase de la clase ClaseA.
Herencia
superclase y subclase
La clase que hereda se llama subclase o clase 
derivada y a la clase de partida se la llama 
superclase o clase base. 
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
TELEFONO
•numero
•marca
llamar(numero)
sonar()
TELEFONO PUBLICO
•numero
•marca
•ubicacion
llamar(numero)
recibirCredito(moneda)
controlarCredito()
TELEFONO CELULAR
•numero
•marca
•antena
llamar(numero)
sonar()
enviarMensaje(mensaje,numero)
La jerarquía de clases de teléfonos:
Herencia
Ejemplo
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
TELEFONO
•numero
•marca
•modelo
llamar(numero)
sonar()
TELEFONO CELULAR
•numero
•marca
•modelo
llamar(numero)
sonar()
enviarMensaje(mensaje,numero)
TELEFONO PUBLICO
•numero
•marca
•modelo
llamar(numero)
recibirCredito(moneda)
controlarCredito()
TELEFONO
•numero
•marca
•modelo
llamar(numero)
sonar()
TELEFONO CELULAR
•numero
•marca
•modelo
llamar(numero)
sonar()
enviarMensaje(mensaje,numero)
TELEFONO
•numero
•marca
llamar(numero)
sonar()
TELEFONO PUBLICO
•numero
•marca
•ubicacion
llamar(numero)
recibirCredito(moneda)
controlarCredito()
TELEFONO CELULAR
•numero
•marca
•antena
llamar(numero)
sonar()
enviarMensaje(mensaje,numero)
Herencia
Ejemplo
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
TELEFONO
•numero
•marca
•modelo
llamar(numero)
sonar()
TELEFONO CELULAR
•numero
•marca
•modelo
llamar(numero)
sonar()
enviarMensaje(mensaje,numero)
TELEFONO PUBLICO
•numero
•marca
•modelo
llamar(numero)
recibirCredito(moneda)
controlarCredito()
TELEFONO
•numero
•marca
•modelo
llamar(numero)
sonar()
TELEFONO CELULAR
•numero
•marca
•modelo
llamar(numero)
sonar()
enviarMensaje(mensaje,numero)
TELEFONO
•numero
•marca
llamar(numero)
sonar()
TELEFONO PUBLICO
•ubicacion
recibirCredito(moneda)
controlarCredito()
TELEFONO CELULAR
•antena
enviarMensaje(mensaje,numero)
Herencia
Ejemplo
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Resumiendo....
La herencia es un mecanismo propio de los 
lenguajes orientados a objetos, que: 
Permite recoger los aspectos comunes de dos o más 
clases de objetos con el máximo nivel de detalle (a nivel de 
atributo y de método).
Permite que una subclase reutilice el código de una 
superclase, facilitando la creación de objetos a partir de 
objetos existentes. 
Ofrece la posibilidad de establecer tantos niveles de 
generalización o de especialización como sean necesarios 
para reflejar nuestro modelo de la realidad. Surge el 
concepto de jerarquía de clases. 
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Herencia Simple y Herencia Múltiple
La herencia simple es aquella en la que cada 
subclase hereda de una única clase. En 
herencia simple, cada clase tiene un solo 
ascendiente y múltiples descendientes.
La herencia múltiple es aquella en la que una 
subclase tiene múltiples superclases.
JAVA soporta herencia simple. 
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Una subclase puede agregar atributos y comportamiento. Una 
subclase puede reemplazar o modificar el comportamiento 
heredado de su subclase, esto se llama sobreescritura. 
Aplicaciones de la herencia
Variables y métodos 
de instancia 
comunes a todos los 
vehículos
Variables y métodos de instancia ESPECÍFICOS de cada tipo de vehículo
superclase
subclases
Es
pe
ci
al
iz
ac
ió
n
G
enera lización
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Con la palabra clave extends
ClaseA
(clase base)
ClaseB
(clase derivada)
¿Cómo indicamos la relación de herencia 
en el código fuente Java?
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
public class Camion extends Vehiculo {
 private boolean tieneDobleCaja;
 private int cargaMaxima;
 public void setCargaMaxima(int cargaMaxima){
 this.cargaMaxima = cargaMaxima;
 }
 public int getCargaMaxima() {
 return cargaMaxima;
 } . . .
}
Aplicaciones de la herencia
 public class Camioneta extends Vehiculos {
 private boolean tieneDobleCabina;
 private boolean es4x4;
 public void setTieneDobleCabina(boolean tieneDobleCabina) {
 this.tieneDobleCabina = tieneDobleCabina;
 }
 public boolean isTieneDobleCabina() {
 return tieneDobleCabina;
 }
 . . . 
} 
public class Auto extends Vehiculo {
 private Stringtipo; // sedan, familiar, etc.
 . . .
}
public class Vehiculo {
 private String marca;
 private double precio;
 . . .
 public void setMarca(String marca) 
{
 this.marca = marca;
 }
 public String getMarca() {
 return marca;
 }
 . . .
}
¿Qué modificación 
deberíamos hacer para 
mantener información sobre 
la caja de cambios de las 
Camionetas, Autos y 
Camiones?
Automáticamente, las 
subclases heredan las 
variables y métodos de la 
superclase 
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Propio de la clase Auto
Heredado de Vehículo
Heredado de Object
(el resto de los métodos)
¿Cómo nos muestra Eclipse los 
métodos propios y los heredados?
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Vehiculo miAuto = new Vehiculo();
¿Qué puedo hacer sobre el objeto miAuto?
Un objeto Camion 
es un Vehiculo
Camion miCamion = new Camion();
¿Qué puedo hacer sobre el objeto miCamion ?
double p= miAuto.getPrecio();
String c= miAuto.getTipoCombustible();
if (miAuto.esUsado()) {.. .}
double p= miCamion.getPrecio(); se pueden invocar a todos los
 métodos heredados de Vehiculo. 
 if (miCamion.isTieneDobleCaja()) {.. .} también se pueden invocar a 
 todos los métodos de Camion
Métodos propios y heredados
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
La clase Camion hereda 
todos los atributos de 
Vehiculo y agrega dos, 
cargaMaxima y 
tieneDobleCaja y sobre-
escribe el método detalles()
Si una clase define un método de instancia con el mismo nombre, 
tipo de retorno y parámetros que uno de los métodos definidos en 
su superclase, dicho método sobrescribe al de la superclase.
Sobreescritura
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
public class Test {
 public static void main(String args[]){
 Vehiculo v = new Vehiculo();
 v.setMarca("Ford");
 v.setPrecio(12000.4);
 System.out.println(v.detalles());
 
 Camion c = new Camion();
 c.setMarca(“Scania");
 c.setPrecio(35120.4);
 c.setCargaMaxima(3000);
 System.out.println(c.detalles()); 
 }
}
public class Vehiculo {
 private String marca;
 private double precio;
 . . .
 public String detalles() {
 return “Vehiculo marca: "+getMarca()
+ "\n”+ "Precio: "+ getPrecio();
 }
 // getters y setters
}
El método detalles() definido en la clase 
Vehiculo, se reemplazó o sobrescribió en la 
subclase Camion.
Ejecutan 
métodos 
diferentes !!
public class Camion extends Vehiculo {
 private boolean tieneDobleCaja;
 private int cargaMaxima;
 
 public String detalles() {
 return "Vehiculo marca: "+getMarca() 
+ "\n"+"Precio: "+getPrecio() 
+"\n"+"carga máxima:"+getCargaMaxima();
 }
 
 // getters y setters 
}
SALIDA
Sobreescritura
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
public class Camion extends Vehiculo {
 private boolean tieneDobleCaja;
 private int cargaMaxima;
 
 public String detalles() {
 return "Vehiculo marca: "+getMarca()
+ "\n"+"Precio: "+getPrecio() 
+"\n"+"carga máxima:"+getcargaMaxima();
 }
 .
}
public class Vehiculo {
 private String marca;
 private double precio;
 . . .
 public String detalles() {
 return “Vehiculo marca: "+getMarca()
+ "\n” + "Precio: "+ getPrecio();
 }
 . . .
}
¿Es posible invocar al 
método detalles() de la clase 
Vehiculo desde un método de 
la clase Camion?
SI!!!!!
¿Cómo?
Usando la palabra clave super
return super.detalles()
+ “\n” 
+ “carga máxima:”+getCargaMaxima();
Sobreescritura y la palabra clave super
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Vehiculo vc = new Camion();
vc.detalles();
¿Qué método detalle() se ejecuta?
El asociado con el objeto “real”; al que hace referencia la 
variable en ejecución, un objeto Camion. Esta característica 
se llama binding dinámico y es propio de los lenguajes OO
Vehiculo vc = new Camion();
vc.setMarca("Mercedes Benz");
vc.setPrecio(35120.4);
vc.setCargaMaxima(3000);
System.out.println(vc.detalles());
¿Funciona?
No está disponible para Vehiculo
NO Compila
upcasting
El upcasting es seguro, la clase base tiene una interface pública que es igual o es un 
subconjunto de la clase derivada. 
Sobreescritura 
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
public class Vehiculo extends Object{
 private String marca;
 private double precio;
 . . .
 public String detalles() {
 return “Vehiculo marca: "+getMarca()
 + "\n”+"Precio: "+ getPrecio();
 }
 . . .
}
public class Vehiculo {
 private String marca;
 private double precio;
 . . .
 public String detalles() {
 return “Vehiculo marca: "+getMarca()
 + "\n”+"Precio: "+ getPrecio();
 }
 . . .
}
La clase Object es la superclase de todas las clases JAVA y está 
ubicada en el paquete java.lang
Cuando se declara una clase sin usar la palabra clave extends el 
compilador JAVA implícitamente agrega el código extends Object a la 
declaración de la clase.
Es equivalente a:
De esta manera, estamos habilitados para sobreescribir los métodos 
heredados de Object.
La clase Object
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
El método public boolean equals(Object obj){} compara la igualdad de 2 
objetos. La versión original del método equals() devuelve true si las dos 
referencias son iguales, es decir si apuntan al mismo objeto en memoria. Es 
equivalente a usar el operador = =.
El método public String toString(){} retorna un string formado por el nombre 
de la clase, seguido del símbolo @ más la representación hexadecimal del 
código hash del objeto sobre el que se invoca al método toString().
El objetivo del método equals(Object o) es comparar el contenido de 
dos objetos y la del método toString() es producir una representación 
textual, concisa, legible y expresiva del contenido del objeto. 
La clase Object
 Los métodos equals() y toString()
public class Fecha {
private int dia= 1;
private int mes= 1;
private int anio=2007;
 // métodos de instancia
} 
Fecha f1 = new Fecha();
Fecha f2 = new Fecha();
f1.equals(f2); false
f1==f2; false
f1.toString(); Fecha@19821f
0x99f311
0x09a456f1
f2
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
public class Fecha {
 private int dia = 1;
 private int mes = 1;
 private int año = 2006;
 public boolean equals(Object o){
 boolean result=false;
 if ((o!=null) && (o instanceof Fecha)){
 Fecha f=(Fecha)o;
 if ((f.getDia()==this.getDia())
 &&(f.getMes()==this.getMes())&& 
 (f.getAño()==this.getAño())) result=true;
 }
 return result; }
 public String toString(){
 return getDia()+"-"+getMes()+"-"+getAño();
 }
 . . . 
 public static void main(String args[]){
 Fecha f1, f2;
 f1 = new Fecha();
 f2 = new Fecha();
 System.out.println(f1==f2);
 System.out.println(f1.equals(f2));
 System.out.println(f1.toString());
 }}
Es un operador que 
permite determinar la 
clase real del objeto
La salida es:
false
true
1-1-2006
Ahora en la clase Fecha: 
El método equals(Object o) 
cumple su objetivo: comparar el 
contenido de dos objetos de tipo 
Fecha. Es por esta razón que 
frecuentemente se lo sobrescribe. 
El método toString() retorna un 
String con datos del objeto Fecha 
en una representación legible.
La clase Object
 Los métodos equals() y toString()
0x99f311
0x09a456f1f2
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura FavaProf. Laura Fava
En JAVA podemos modelar un CONCEPTO ABSTRACTO mediante una 
clase abstracta cuya finalidad NO es crear instancias. 
Pensemos en una aplicación que dibuja figuras geométricas, podríamos 
dibujar por ejemplo: círculos, rectángulos, triángulos, líneas rectas, etc. 
Todas las figuras geométricas pueden cambiar de color, dibujarse en la 
pantalla, moverse, etc., pero cada una lo hace de una manera particular. 
Por otro lado, una figura geométrica, es un 
concepto abstracto, no es posible dibujarla o 
redimensionarla, sólo sabemos que todas las 
figuras geométricas concretas, como los 
círculos, rectángulos, triángulos tienen esas 
capacidades. 
Clases Abstractas
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
public class FiguraGeometrica {
 private Color color; 
 private int x;
 private int y;
 public void mover(int x, int y){
 this.x = x;
 this.y = y;
 }
 public void setColor(Color nuevoColor) 
{
 color = nuevoColor; 
 dibujar(); 
 } 
 public void dibujar() { 
 ??
 }
 public int area(){
 ?? 
 }
}
La clase FiguraGeometrica NO 
representa una figura real, y por lo 
tanto NO puede definir 
implementaciones para todos sus 
métodos. ¿Qué hacemos?
 La declaramos abstracta
Clases Abstractas
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
El objetivo de definir una clase abstracta es lograr una interface de 
comportamiento común para los objetos de las subclases (de la clase 
abstracta) .
Se espera que una clase abstracta sea extendida por clases que 
implementen todos sus métodos abstractos. En una clase abstracta 
pueden existir métodos concretos y métodos abstractos.
¿Qué es un método abstracto? Es un método que NO tiene 
implementación. Se define el nombre, el tipo de retorno, la lista de 
argumentos, termina con “;” y se antepone la palabra clave abstract. 
NO tiene código.
¿Para qué sirve un método sin código?
Para definir un comportamiento común para todos los 
objetos de las subclases concretas
Clases Abstractas
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
public abstract class FiguraGeometrica {
 // Color de la figura 
 private Color color; 
 private int x;
 private int y;
 
 public void mover(int x, int y){
 this.x = x;
 this.y = y;
 }
 public void setColor(Color nuevoColor)
{
 color = nuevoColor; 
 dibujar(); 
 } 
 public abstract void dibujar();
}
Para declarar una clase abstracta se antepone la palabra clave abstract a la palabra 
clave class. Una clase abstracta es una clase que solamente puede ser EXTENDIDA, 
no puede ser INSTANCIADA.
public class TestFiguras {
public static void main(String args[]){
new FigurasGeometricas();
}
}
Si se intenta crear objetos de una clase 
abstracta, fallará la compilación. El 
compilador NO permite crear instancias 
de clases abstractas.
Los métodos abstractos no tiene 
cuerpo, su declaración termina con “;”
Una clase abstracta puede 
contener métodos abstractos 
y métodos concretos. 
Clases Abstractas
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
métodos 
abstractos
clase 
abstracta
clases 
concretas
FiguraGeometrica es una clase abstracta y los métodos area() y dibujar() son abstractos. 
Para que las subclases Rectangulo, Rombo y Circulo sean concretas, deben proveer una 
implementación de cada uno de los método abstractos de la clase FiguraGeometrica.
Las clases abstractas 
pueden declarar variables 
de instancia
Las clases abstractas 
pueden declarar métodos 
concretos
métodos 
concretos
Clases Abstractas y Herencia
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Polimorfismo
Herencia y Upcasting
Lo más interesante de la herencia es la relación entre la clase derivada y la clase 
base: “la clase derivada es un tipo de la clase base” (es-un o es-como-un). 
Upcasting es la conversión de una referencia de un objeto de la clase derivada en 
una referencia de un objeto de la clase base. 
El upcasting es seguro: la clase derivada es un super 
conjunto de la clase base, podría contener más métodos 
que la clase base, pero seguro contiene los métodos de la 
clase base. 
Upcasting o 
casting 
ascendente
Acepta como parámetro una referencia a un 
Instrumento o a cualquier derivado de Instrumento
public abstract class InstrumentoMusical{
 public abstract void tocar(Nota n);
}
public class Vientos extends 
InstrumentoMusical{
 public void tocar(Nota n) {
 System.out.print(“Vientos.tocar(): ”+n); 
 }}
public class CancionSimple {
 Nota[] pentagrama = new Nota[100];
 public void sonar(InstrumentoMusical i){
 for (Nota n:pentagrama) 
 i.tocar(n);
 }
 public static void main(String[] args) {
 CancionSimple cs = new CancionSimple();
 Vientos flauta = new Vientos();
 cs.sonar(flauta);
 }
}
Se pasa como parámetro una referencia a un objeto Vientos sin necesidad 
de hacer casting, se hace un upcasting automático. 
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Otra solución: sonar() es un método sobrecargado que tiene como argumento un 
objeto de tipo Vientos o Cuerdas en vez de un objeto InstrumentoMusical. 
¿Es una buena solución?
public class CancionSimple {
 Nota[] pentagrama = new Nota[100];
 public void sonar(Vientos i){
 for (Nota n:pentagrama) 
 i.tocar(n);
 } 
 public static void main(String[] args){
 CancionSimple cs = new CancionSimple();
 Vientos flauta = new Vientos();
 cs.sonar(flauta);
 }
}
Polimorfismo
public void sonar(Cuerdas i){
 for (Nota n:pentagrama) 
 i.tocar(n);
}
El polimorfismo permite escribir código que “hable” con la 
clase base y las clases derivadas.
public class CancionSimple {
 Nota[] pentagrama = new Nota[100];
 public void sonar(InstrumentoMusical i){
 for (Nota n:pentagrama) 
 i.tocar(n);
 }
 
 public static void main(String[] args) {
 CancionSimple cs = new CancionSimple();
 Vientos flauta=new Vientos();
 cs.sonar(flauta);
 Cuerdas guitarra=new Cuerdas();
 cs.sonar(guitarra);
 }
}
Solución apropiada
se hace un 
upcasting 
automáticoCuerdas piano = new Cuerdas();
cs.sonar(piano);
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
public class CancionSimple {
 Nota[] pentagrama = new Nota[100];
 public void sonar(InstrumentoMusical i){
 for (Nota n:pentagrama) 
 i.tocar(n);
 } 
 public static void main(String[] args) {
 CancionSimple cs = new CancionSimple();
 if (args[0].equals(“V”))
 Vientos ins=new Vientos();
 else
 Cuerdas ins=new Cuerdas();
 cs.sonar(ins);
 }}
¿Puede el compilador java saber que el objeto InstrumentoMusical pasado como 
parámetro en sonar() es una referencia a un objeto Vientos o Cuerdas? 
m1(){}
m2(){}
m3(){}
main(){
 m1();
 m2();
 . . . 
}
Conectar la invocación de un método con el cuerpo del método, se llama binding. Si el binding, se hace en 
compilación, se llama Binding temprano (early binding) y si se hace en ejecución binding tardío (early binding) 
o binding dinámico (dynamic binding).
Binding 
temprano
En compilación 
se resuelven 
todas las 
invocaciones a 
métodos
m2()
......
......
m1() 
......
......compilador
. . . 
. . . 
llamada a m1()
llamada a m2()
. . . 
. . . 
Código fuente Código compilado Binding Dinámico 
El compilador no conoce qué 
método invocará cuando recibe 
la referencia a un objetoInstrumentoMusical. El 
binding se resuelve en 
ejecución.
Polimorfismo y Binding Dinámico
NO!!
No hay manera de saber, 
mirando el código, que tipo de 
instrumento ejecutará el 
tocar(), eso depende del 
valor que tome la variable i en 
ejecución.
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
• Java usa binding dinámico: la resolución de las invocaciones a métodos, se hace 
en ejecución (run-time), basándose en el tipo del objeto receptor. 
• Java provee un mecanismo para determinar en ejecución el tipo del objeto 
receptor e invocar al método apropiado. 
• Aprovechando que java usa binding dinámico, el programador puede escribir 
código que hable con la clase base, conociendo que las clases derivadas 
funcionarán correctamente usando el mismo código.
Polimorfismo y Binding Dinámico
• El polimorfismo promueve la 
construcción de código extensible: un 
programador podría agregar subclases a 
InstrumentoMusical sin tocar el método 
sonar(InstrumentoMusical i). 
Taller de Lenguajes II – Ingeniería en Computación – 2012 Prof. Claudia Queiruga - Prof. Laura Fava
Polimorfismo y Binding Dinámico
El polimorfismo significa “diferentes formas”. En POO se tiene una interface común 
en la clase base y diferentes versiones de métodos ligados dinámicamente: binding 
dinámico. 
 package polimorfismo;
 public class CancionSimple {
 private Nota[] pentagrama = new Nota[100];
 public void sonar(InstrumentoMusical i) {
 for (Nota n: pentagrama)
 i.tocar(n);
 }
 public static void main(String[] args) {
 CancionSimple cs = new CancionSimple();
 InstrumentoMusical[] m={new Viento(),
 new Cuerdas(),new Percusion(),new Saxo()};
 for (int i=0;i<m.length;i++)
 cs.sonar(m[i]);
 }
 }
El binding dinámico resuelve a que 
método invocar, cuando más de una 
clase en una jerarquía de herencia 
implementó un método (en este caso 
tocar()). 
La JVM busca la implementación de 
los métodos invocados de acuerdo al 
tipo del objeto receptor en tiempo de 
ejecución. Binding dinámico. 
La declaración del tipo de la variable 
(InstrumentoMusical) es utilizada por 
el compilador de java para chequeo 
de errores durante la fase de 
compilación, pero el compilador no 
puede resolver qué método que se 
ejecutará. 
Si se agregan nuevas clases a la 
jerarquía de herencia el método 
sonar(InstrumentoMucical i), no 
se ve afectado  esto es lo que 
provee el polimorfismo.
upcasting automático a InstrumentoMusical.
Taller de Lenguajes II – Prof. Queiruga y Prof. Fava – Año 2011 
	Página 1
	Página 2
	Página 3
	Página 4
	Página 5
	Página 6
	Página 7
	Página 8
	Página 9
	Página 10
	Página 11
	Página 12
	Página 13
	Página 14
	Página 15
	Página 16
	Página 17
	Página 18
	Página 19
	Página 20
	Página 21
	Página 22
	Página 23
	Página 24
	Página 25
	Página 26
	Página 27
	Página 28
	Página 29
	Página 30
	Página 31
	Página 32
	Página 33
	Página 34
	Página 35

Continuar navegando

Contenido elegido para ti