You are on page 1of 13

Programacin Orientada a Objetos

Herencia y Polimorfismo
Resumen
- Concepto y mecanismo de herencia
- Herencia y constructores
- super
- Herencia y sobreescritura de mtodos
- Herencia y modificador final
- Clase de compilacin y de ejecucin
- instanceof
- Ligadura dinmica
- Clases abstractas
- Interfaces
- Herencia en interfaces
Programacin Orientada a Objetos
Objetivos
- Conocer y comprender el concepto de herencia en la
programacin orientada a objetos
- Conocer y comprender los conceptos de polimorfismo y
ligadura dinmica
- Conocer y comprender las caractersticas y diferencias
de las clases abstractas y de las interfaces
- Disear pequeas aplicaciones en Java que utilicen el
mecanismo de herencia, clases abstractas e interfaces
Herencia - Qu es?
- Propiedad esencial de la POO que consiste en la
creacin de nuevas clases a partir de otras ya
existentes
- Cuando una clase hereda de otra, contendr los
mtodos y atributos de la clase padre
- La herencia permite:
- La reutilizacin del cdigo
- Aadir nuevos comportamientos a las clases hijas
- La redefinicin de comportamientos
- Creacin de clasificaciones jerrquicas de clases
Programacin Orientada a Objetos
Herencia - Ejemplos
- Figura
- Rectngulo
- Cuadrado
- Circulo
- Rombo
- .
Programacin Orientada a Objetos
- Animal
- Mamfero
- Ballena
- Caballo
- Perro
- Ave
- .
Programacin Orientada a Objetos
Herencia - Aspectos Generales
- En Java no hay herencia mltiple (aunque se puede
simular)
- La clase java.lang.Object es la base de toda la jerarqua
de clases de Java:
- Si al definir una clase no se especifica de qu clase deriva,
por defecto la clase deriva de Object
- Proporciona mtodos heredados como toString(), equals(),
getClass(), clone().
A
B C
A
B C
Programacin Orientada a Objetos
Herencia - Aspectos Generales
class claseHija extends clasePadre {...}
- Representa una relacin "es un"
- "extends" especifica que la clase hija hereda datos y
mtodos de clase padre
- Aunque hereda todo, la clase hija solo tiene acceso a
los miembros de la clase padre con modificadores
"public, protected, o package (o vaco)"
- En situaciones excepcionales, puede interesar definir
una variable en la subclase con el mismo nombre que la
superclase (se tendran huecos diferentes de memoria)
Programacin Orientada a Objetos
Herencia - Ejemplo
class Punto3D extends Punto {
int z;
Punto3D(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
Punto3D() { this(0, 0, 0);}
}
class Punto{
int x;
int y;
Punto(int x, int y) {
this.x = x;
this.y = y;
}
Punto(){ this(0,0);}
}
Herencia - Constructores
Programacin Orientada a Objetos
class A {
A() { System.out.println(" constructor de A");}
}
class B extends A {
B() { System.out.println(" constructor de B");}
}
class C extends B {
C() { System.out.println("constructor de C");}
}
class Principal {
public static void main(String args[]) {
C c = new C();
}} Salida:
constructor de A
constructor de B
constructor de C
Programacin Orientada a Objetos
Herencia - super
- super permite acceder tanto a los constructores como a
los mtodos de la superclase
- Se puede llamar al constructor de una superclase desde
el constructor de la subclase utilizando la palabra
super([args]) en la primera sentencia, excepto si se
llama a otro constructor de la misma clase con this
- Existe una llamada implcita al constructor por defecto
de la superclase aunque no se especifique
Herencia - super - Ejemplo 1
class Punto3D extends Punto {
int z;
Punto3D(int x, int y, int z) {
super(x,y);
this.z = z;
}
Punto3D() { this(0, 0, 0);}
}
class Punto{
int x;
int y;
Punto(int x, int y) { this.x = x; this.y = y;}
Punto(){ this(0,0);}
}
class Punto3D extends Punto {
int z;
Punto3D(int x, int y, int z) {
this.x = x;
this.y = y;
this.z = z;
}
Punto3D() { this(0, 0, 0);}
}
Programacin Orientada a Objetos
Herencia - super - Ejemplo 2
public class A {
private int x; // No es accesible desde la clase B
public A () { this.x=7;}
public A (int x) { this.x=x;}
}
public class B extends A {
private int y;
public B () {
super(); // Si lo quitamos, llama A() podemos
this.y=5; // prescindir de l
}
public B (int y) {
super(y); // Si lo quitamos, llama A()
this.y=y;
}}
Programacin Orientada a Objetos
Ejercicio 1 - Herencia
- Qu ocurre en el siguiente cdigo? Cmo corregiras el
error?
public class A {
private int x=3;
private int y=4;
}
public class B extends A {
private int z = 9;
public B () {
this.x=33;
super.y=44;
this.z=55;
}}
Programacin Orientada a Objetos
Ejercicio 2 - Herencia
- Implementar la clase CajaPeso que heredar de la clase
Caja, tendr un atributo que ser el peso de la caja, y
un constructor para permitir la creacin de objetos de
esta clase
class Caja {
private double alto;
private double ancho;
private double largo;
Caja(double a, double b, double c) {
alto = a;
ancho = b;
largo = c;
}} Programacin Orientada a Objetos
Ejercicio 3 - Herencia
class A { int i; }
class B extends A {
int i;
B(int a, int b) {
i = a;
super.i = a;
}
void mostrar() {
System.out.println("i de la superclase: " + super.i);
System.out.println("i de la subclase: " + i);
}
}
Programacin Orientada a Objetos
a que i hace referencia?
Ejercicio 4 - Herencia
- Realizar la clase RobotConFrontera que hereda de la
clase Robot
Programacin Orientada a Objetos
public class Robot {
private int x, y;
public Robot (int x, int y) { this.x = x; this.y = y; }
public void avanzar (int a) { this.x += a; this.y += a; }
public int getX () { return this.x; }
public int getY () { return this.y; }
public void setX(int x){ this.x = x; }
public void setX(int x){ this.x = x; }
public String toString () { return "Robot[" + getX() + ", " + getY() + "]";
}
}
Ejercicio 4 - Herencia
Programacin Orientada a Objetos
public class Ejemplo {
public static void main(String args[]) {
Robot r1,r2;
r1 = new Robot(1, 1); r1.avanzar(2);
r2 = new RobotConFrontera(2, 1, 0, 0);
r2.avanzar(-2);
System.out.println("Robot1: " + r1.toString());
System.out.println("Robot2: " + r2.toString());
}
}
Robot1: Robot[3, 3]
Robot2: Robot[0, 1]{bordes: 0, 0}
Herencia - Sobreescritura de mtodos
- Un mtodo se puede especializar, redefinir o sustituir
(overriding) en una subclase
- El tipo de retorno, nombre del mtodo, tipo y nmero
de argumentos debe ser el mismo
- Las excepciones lanzadas deben ser, como mucho, las
declaradas por el mtodo a redefinir (ms adelante)
- Los modificadores deben ser al menos tan generales
como los del mtodo en la superclase (p.e. protected
public, pero no protected private)
- super.nombreMetodo([args]) Mtodo de la
superclase
- Si el mtodo en la superclase es "final" no se puede
hacer overriding Seguridad o diseo perfecto
Programacin Orientada a Objetos
Herencia - Sobreescritura de mtodos - Ejemplo
class A { public void f (int x) { S.O.P.("En clase A: " + x); }}
class B extends A {
public void f (int x) {
S.O.P.("En clase B: " + x);
super.f(x+2);
}}
public class Main {
public static void main(String args[]) {
B b= new B();
b.f(3);
}}
Programacin Orientada a Objetos
En clase B: 3
En clase A: 5
Herencia - Sobreescritura de mtodos - Ejemplo
Programacin Orientada a Objetos
A a = new A(10,20);
B b = new B(7);
System.out.println(a.mostrar()); // 10 20
System.out.println(b.mostrar()); // 7 7 7
b.sum(); // 21
public class A {
private int i, j;
public A (int i, int j){ this.i = i; this.j = j;}
public int getI(){ return i;}
public int getJ(){ return j;}
public String mostrar() { return (i + " " + j);}
}
class B extends A {
private int k;
public B (int a){ super(a,a); this.k = a;}
public String mostrar() { return (super.mostrar()+ " " + k);}
void sum() { System.out.println((getI()+getJ()+k));}
}
Ejercicio 5 - Herencia - Sobreescritura de mtodos
class A {
int i, j;
A(int a, int b) { i = a;j = b;}
void mostrar() { S.O.P.("i y j: " + i + " " + j);}
}
class B extends A {
int k;
B(int a, int b, int c) {
super(a, b);
k = c;
}
void mostrar() { S.O.P.("k: " + k);}
}
.
B subOb = new B(1, 2, 3);
subOb.mostrar(); }
.
A qu mtodo "mostrar" se llama?
Programacin Orientada a Objetos Programacin Orientada a Objetos
Herencia - final
- Una clase puede declarar una clase como final, cuando
no nos interesa crear clases hijas de dicha clase (p.e.
clase String - razones de seguridad)
- Una atributo final es una constante
- Un mtodo declarado como final no puede ser
redefinido en herencia por las clases hijas
Herencia - final - Ejemplo
class Padre{
.
final public void funcionFinal() {.}
public void dibujar(Graphics g) {.}
}
class Hija{
.
public void dibujar(Graphics g) {.}
}
Programacin Orientada a Objetos
Clases de expresiones - Asignaciones y operador instanceof
- Un objeto siempre pertenece a una clase
- Existe diferencia entre:
- Clase en tiempo de compilacin Tipo declarado
- Clase en tiempo de ejecucin Procedencia a travs de
new (.) de una expresin
- El operador instanceof tiene dos operandos:
- Un objeto en el lado izquierdo
- Una clase en el lado derecho
- El operador instanceof devuelve true o false
dependiendo de que el objeto situado a la izquierda sea
o no una instancia de la clase situada a la derecha o de
alguna de sus clases derivadas
Programacin Orientada a Objetos
Clases de expresiones - Asignaciones y operador instanceof
- Ejemplo 1:
Rectangulo rect = new Rectangulo(0, 0, 5.0, 2.0);
rect instanceof String // false
rect instanceof Rectangulo // true
rect instanceof Figura // true
rect instanceof Cuadrado // false
- Ejemplo 2:
A objA = new A(0, 0);
B objB = new B(1, 1, 0);
objA instanceof B // false
objA instanceof A // true
objB instanceof A // true
objB instanceof B // true
Programacin Orientada a Objetos
Ligadura dinmica
- Asignacin en tiempo de ejecucin del cdigo a ejecutar
para un determinado mtodo
- La eleccin del cdigo a ejecutar para la instruccin
"<objeto>.<metodo>(<[args]>)", en donde C1 y C2
son las clases esttica y dinmica de <objeto>,
respectivamente, consiste en:
1. Compilacin: Se determina la cabecera del mtodo a
aplicar. Si existe overloading de <metodo> en C1, se
elige el mtodo ms especfico definido para <metodo>
en la clase C1
2. Ejecucin: Una vez seleccionada la "cabecera a aplicar",
si se ha hecho overriding de <metodo> en C2 se aplica
ligadura dinmica (si no hay ligadura dinmica, se aplica
el mtodo de la clase C1)
Programacin Orientada a Objetos
Ligadura dinmica - Ejemplo
public class Ejemplo {
public static void main(String args[]) {
A[] array = {new A(), new B(), new C()};
for (int i=0; i<3; i++) {
array[i].f(3);
}
}
}
class A {
public void f (int x) { S.O.P.("En clase A: " + x); }}
class B extends A {
public void f (int x) { S.O.P. ("En clase B: " + x); }}
class C extends A {
public void f (int x) { S.O.P. ("En clase C: " + x); }}
Ejercicio 6 - Ligadura dinmica
- La sentencia fig[i].area(); en el siguiente ejemplo, a
qu mtodo llamar?
Figura[] fig=new Figura[4];
fig[0]=new Rectangulo(0,0, 5.0, 7.0);
fig[1]=new Circulo(0,0, 5.0);
fig[2]=new Circulo(0, 0, 7.0);
fig[3]=new Rectangulo(0,0, 4.0, 6.0);
Programacin Orientada a Objetos
Programacin Orientada a Objetos
Herencia - Clases abstractas - abstract
- Una clase abstracta (abstract) es una clase de la que no
se pueden crear objetos
- Sirven para proporcionar un modelo que deben seguir a
las clases hijas y algunos mtodos de utilidad general
- Declaracin:
[acceso] abstract class claseAbstracta { ... }
- Los mtodos en las clases abstractas:
- Pueden ser mtodos abstractos (sin cdigo). Si una clase
tiene algn mtodo abstracto, es obligatorio que la clase
sea abstracta. En las subclases deber ser implementado
o volver a declararse como abstracto
- Mtodos no abstractos
- Constructores que pueden ser llamados con super
Clases abstractas - Ejemplo
abstract class A {
abstract void llamada() ;
void noAbstracto() {
System.out.println("Mtodo no abstracto");
}
}
class B extends A {
void llamada() {
System.out.println("Implementacin mtodo abstracto");
}
}
Programacin Orientada a Objetos
Ejercicio 7 - Clases Abstractas
- Cul es la salida del siguiente programa?
abstract class A {
abstract void llamame();
void otro() { S.O.P.("Mtodo otro de A"); }
}
class B extends A {
void llamame() { S.O.P.("Mtodo llamame de B"); }
}
public class Abstract {
public static void main(String args[]) {
A a = new B();
a.llamame();
a.otro();
}}
Programacin Orientada a Objetos
Ejercicio 8 - Clases Abstractas
- Cul es la salida del siguiente programa?
abstract class A {
abstract void llamame();
}
class B extends A {
void llamame() { S.O.P.("Mtodo llamame de B"); }
void otro() { S.O.P.("Mtodo otro de B"); }
}
public class Abstract {
public static void main(String args[]) {
A a = new B();
a.llamame();
a.otro();
}}
Programacin Orientada a Objetos
Programacin Orientada a Objetos
Ejercicio 9 - Clases abstractas
- Implementar el cdigo de la clase Figura, Triangulo,
Circulo y Punto teniendo en cuenta lo siguiente:
- Las clases Triangulo y Circulo heredan de la clase abstracta
Figura, la cual tiene un atributo que define de qu color es
la figura y un mtodo abstracto para el clculo del rea.
- Un tringulo se puede representarse por sus tres vrtices.
El rea del tringulo es el valor absoluto de:
(((p2.x - p1.x)*(p3.y - p1.y)) -
((p2.y - p1.y) * (p3.x-p1.x))) / 2
- Un crculo se representa por su centro y por el radio
- Un ejemplo de PP se muestra a continuacin:
Ejercicio 9 - Clases abstractas
public class Ejercicio {
public static void main(String args[]) {
Figura[] figuras = new Figura[2];
Punto p1 = new Punto(0,0), p2 = new Punto(1,0),
p3 = new Punto(0,1);
figuras[0] = new Triangulo("rojo", p1, p2, p3);
figuras[1] = new Circulo("verde", p1, 1);
for (int i=0; i < figuras.length; i++) {
System.out.println("Area: " + figuras[i].area());
}
}
}
Programacin Orientada a Objetos
Interfaces - Qu son?
- Una interfaz es un protocolo de comunicacin entre
objetos
- Por ejemplo: Distintos grupos de programadores
escriben distintos mdulos de aplicaciones. Pueden
interactuar con otros mdulos si conocen cul es la
interfaz
Programacin Orientada a Objetos
Interfaces - Qu son?
- Es una coleccin de definiciones de mtodos (sin
implementacin) y de valores estticos y constantes
Define la interaccin, NO la conducta
- Si se definen propiedades, por omisin, son static y
final, por lo no podrn ser modificadas en ninguna clase
que la implemente
- Una interfaz es anlogo a una clase abstracta con todos
sus mtodos abstractos. Como es lgico, los mtodos
no pueden ser privados
- Las clases que implementen una interfaz deben
implementar todos los mtodos definidos en la interfaz
Programacin Orientada a Objetos
Interfaces - Qu son?
- Una clase puede heredar de una sola clase (extends) y
puede implementar varias interfaces (implements)
- Una clase que implementa una interfaz puede tener
mtodos propios
- Una interfaz NO se puede instanciar
- Los mtodos de las clases que implementan un interfaz
deben ser pblicos
- Si se hereda del mismo mtodo de varias interfaces, el
mtodo ser nico en la clase
- Se permite herencia entre interfaces
Programacin Orientada a Objetos Programacin Orientada a Objetos
Interfaces - Implementacin
[acceso] interface MiInterfaz{
[acceso] tRetorno metodo1([args]);
[acceso] tRetorno metodo1([args]);
.
}
[acceso] class MiClase implements MiInterfaz {
public tRetorno metodo1([args]);
public tRetorno metodo1([args]);
.
}
Programacin Orientada a Objetos Programacin Orientada a Objetos
Interfaces - Implementacin - Ejemplo 1
interface Llamada{
void llamar(int param);
}
class Cliente implements Llamada{
public void llamar(int p){
System.out.println("Llamar" + p);
}
}
Programacin Orientada a Objetos Programacin Orientada a Objetos
Interfaces - Implementacin - Ejemplo 2
import java.awt.Graphics;
public interface Dibujable {
public void setPosicion(double x, double y);
public void dibujar(Graphics dw);
}
class Circulo implements Dibujable{
.
public void setPosicion(double x, double y){
this.x = x;
this.y = y;
}
public void dibujar(Graphics dw){ dw.paint(); }
}
Programacin Orientada a Objetos
Interfaces - Implementacin - Ejemplo 3
public static void main(String args[]) {
Pais[] paises={ new Pais("Italia"), new Pais("Francia"),
new Pais("Espaa")};
Entero[] numeros={new Entero(3), new Entero(4),
new Entero(1)};
Algoritmos.ordenar(paises);
Algoritmos.ordenar(numeros);
for (int i = 0; i < paises.length; i++)
System.out.println(paises[i]);
for (int i = 0; i < numeros.length; i++)
System.out.println(numeros[i]);
}
Espaa
Francia
Italia
1
3
4
Programacin Orientada a Objetos
Interfaces - Implementacin - Ejemplo 3
public interface Ordenable { boolean menorQue(Ordenable a); }
public class Algoritmos {
public static void ordenar(Ordenable a[ ]) {
Ordenable temp;
int este;
for (int i=0; i<a.length-1; i++) {
este = i;
for (int j=i+1; j<a.length; j++)
if (a[j].menorQue(a[este])) este = j;
temp=a[este]; a[este]=a[i]; a[i]=temp;
}}
Programacin Orientada a Objetos
Interfaces - Implementacin - Ejemplo 3
public class Entero implements Ordenable {
private int valor;
public Entero (int n) { this.valor = n; }
public boolean menorQue(Ordenable entero) {
Entero i = (Entero) entero;
return valor<i.valor;
}
public String toString () { return String.valueOf(this.valor);}
}
Programacin Orientada a Objetos
Interfaces - Implementacin - Ejemplo 3
public class Pais implements Ordenable {
private String nombre;
public Pais (String n) { this.nombre = n; }
public boolean menorQue(Ordenable pais) {
Pais b = (Pais) pais;
return nombre.compareTo(b.nombre)<0;
}
public String toString () { return this.nombre; }
}
Programacin Orientada a Objetos
Ejercicio 10 - Interfaces
- Qu ocurre en el siguiente cdigo?
public interface MiInterfaz {
public void MiMetodo(int valor){
System.out.println("Valor: " + valor);
}
}
Programacin Orientada a Objetos
Ejercicio 11 - Interfaces
- Suponga que tiene que escribir un servidor de fecha y
hora, el cual se encarga de notificar peridicamente a
sus clientes la fecha y la hora actual
- Escribir una interfaz que el servidor pueda utilizar para
establecer un protocolo sobre sus clientes
Programacin Orientada a Objetos
Ejercicio 12 - Interfaces
- Realizar la clase Pila que implementa los mtodos de la
interfaz Coleccion
- Los elementos de la pila se almacenarn en un vector
- Adems de los mtodos de la interfaz la clase Pila
deber implementar el mtodo compruebaPilaVacia, que
se encargar de devolver true/false dependiendo de si
la pila est vaca o no
public interface Coleccion {
public int MAXIMO = 500;
public void introducir (Object o);
public Object extraer ();
}
Programacin Orientada a Objetos
Interfaces - Herencia - Ejemplo
A
metodo1()
metodo2()
B
metodo3()
MiClase
metodo1()
metodo2()
metodo3()
interface A {
void metodo1();
void metodo2();
}
interface B extends A {
void metodo3();
}
Programacin Orientada a Objetos
Interfaces - Herencia - Ejemplo
class MiClase implements B {
public void metodo1() { S.O.P("Metodo1"); }
public void metodo2() { S.O.P("Metodo2"); }
public void metodo3() { S.O.P("Metodo3"); }
}
class Principal {
public static void main(String arg[]) {
MiClase ob = new MiClase();
ob.metodo1();
ob.metodo2();
ob.metodo3();
}}
Programacin Orientada a Objetos
Ejercicio 13 - Interfaces
- Realizar:
- Una interfaz Parlanchin que tenga un mtodo llamado
habla
- Dos clases abstractas llamadas Animal y Reloj que
implementen la interfaz Parlanchin
- Dos clases hijas de la clase abstracta Animal llamadas
Perro y Gato, teniendo en cuenta que los perros hacen
"guau" y los gatos hacen "miau"
- Una clase hija de la clase abstracta Reloj llamada
RelojCuco, teniendo en cuenta que los relojes de cuco
hacen "cucu, cucu"
Programacin Orientada a Objetos
Ejercicio 13 - Interfaces
- Adems se tendr en cuenta:
public class PoliApp {
static void hazleHablar(Parlanchin sujeto){
sujeto.habla();
}
public static void main(String[] args) {
Gato gato=new Gato();
hazleHablar(gato);
RelojCuco cuco=new RelojCuco();
hazleHablar(cuco);
}
}

You might also like