Sunteți pe pagina 1din 21

UNIDAD V HERENCIA

Herencia
 Una de las caractersticas fundamentales de la POO que ms destacan es la herencia. La herencia provee el mecanismo ms simple para especificar una forma alternativa de acceso a una clase existente.  Esta nueva clase se denomina subclase o clase derivada y la clase existente superclase o clase base.

Herencia
 La herencia se basa en la existencia de relaciones de generalizacin/especializacin entre clases.  Una jerarqua de clases muestra cmo los objetos se derivan de otros objetos ms simples heredando su comportamiento.
Clase Cuentas

Clase CuentaCorriente

Clase CuentaAhorro

Clases y mtodos abstractos


 Cuando se disea una clase para ser genrica, es casi seguro que no necesitaremos crear objetos de ella, la razn de su existencia es proporcionar los atributos y comportamientos que sern compartidos por todas las subclases. Una clase que se comporte de la forma descrita se denomina clase abstracta y se define como tal calificndola explcitamente con la abstract.

Clases y mtodos abstractos


public abstract class Cuenta { //cuerpo de la clase }
 Una clase abstracta puede contener el mismo tipo de

miembros que una clase que no lo sea y adems puede tener mtodos abstractos, que una clase no abstracta no puede contener, pero NO se permite crear objetos de ella.
 Un mtodo abstracto tiene la particularidad de no tener

cuerpo.

Clases y mtodos abstractos


public abstract class Cuenta { // public abstract void comisiones(); // }
 La idea principal es proporcionar mtodos que deban ser

redefinidos en las subclases de la clase abstracta, con la intencin de adaptarlos a las necesidades particulares de stas.

Ejemplo

Ejemplo

Clase: Animal

Clase: Mamifero

Clase: Ave

public abstract class Animal {

Clase Animal
} {

//atributos private String nombre; private String sonido; private int numPatas; //constructor sin argumentos public Animal() {

public void setNombre(String nom)

nombre=nom; } public void setSonido(String son) { sonido=son; } public void setNumPatas(int numP) { numPatas=numP; }

public String getNombre() { return nombre; } public String getSonido() { return sonido; } public int getNumPatas() { return numPatas; } //mtodo abstracto que se redefinir en las clases derivadas public abstract void setAccion(); public abstract String getAccion(); }

import javax.swing.JOptionPane; public class Mamifero extends Animal{ //atributos String acc; //constructor public Mamifero() { acc="No hace nada"; } public Mamifero(String nom, String son, int numP, String ac) { setNombre(nom); setAccion(ac); setNumPatas(numP); setSonido(son); } //mtodo que se sobrescribe public void setAccion() { acc=JOptionPane.showInputDialog("Qu accion hace este mamfero?"); } public void setAccion(String ac) { acc=ac; } public String getAccion() { return acc; } }

Clase Mamfero

                           

Clase Ave

public class Ave extends Animal{ String acc; //constructor public Ave() { setNombre("pioln"); setAccion(); setNumPatas(2); setSonido("tui, tui, tuiii"); } //mtodo que se sobrescribe public void setAccion() { acc="volar"; } public String getAccion() { return acc; } }

Clase Herencia

import javax.swing.JOptionPane; public class Herencia1 { public static void main(String[] args) { Mamifero perro = new Mamifero(); perro.setAccion(); perro.setNombre("franky"); perro.setNumPatas(4); perro.setSonido("guuaauu, guau..."); JOptionPane.showMessageDialog(null,"Nombre: "+perro.getNombre()+"\nHace sonido: "+perro.getSonido()+"\nLe gusta: "+perro.getAccion()); Mamifero gato = new Mamifero("Pachoncito","miuu, miauu",4,"ronronea"); JOptionPane.showMessageDialog(null,"Nombre: "+gato.getNombre()+"\nHace sonido: "+gato.getSonido()+"\nLe gusta: "+gato.getAccion()); Ave canario = new Ave(); JOptionPane.showMessageDialog(null,"Nombre: "+canario.getNombre()+"\nHace sonido: "+canario.getSonido()+"\nLe gusta: "+canario.getAccion()); } }

Constructores de las subclases


 Sabemos que cuando se crea un objeto de una clase se invoca a su constructor.  Pero los constructores de las superclases no se heredan a las subclases, por esto java permite que se invoquen explcitamente al constructor de la clase base (superclase).  Esto se hace utilizando la palabra reservada super.

Constructores de las subclases


Formato para la definicin de un constructor con parmetros de una subclase: Nombre_subClase (lista_de_parmetros) { super(lista_de_parametros); //cuerpo del constructor de la clase }

Constructores de las subclases


 Si la superclase no tiene un constructor de forma explcita o tiene uno que no requiere parmetros, no se necesita invocarlo explcitamente, ya que java lo invocar automticamente mediante super() sin argumentos.

Acceso a mtodos y atributos de superclases


 Para acceder a un mtodo o atributo de la superclase que han sido redefinidos en las subclases, se puede utilizar la palabra reservada super.  Ejemplo:

();

Ejemplo (clase base)


               

public class ClaseBase { public int valor=5; public ClaseBase(int x) { valor=x; } public void setValor(int x) { valor=x; } public int getValor() { return valor; } }

Ejemplo (clase derivada)


public class ClaseDerivada extends ClaseBase{ private int valor=1; private int y=0; public ClaseDerivada(int x, int y) { super(x); this.y=y; } public int getValor(){ return valor; } public int getValor2(){ return super.x; } public void setValor(int x){ valor=x; } public void setValor2(int y){ this.y=y; } }

Ejemplo (main)
import javax.swing.JOptionPane; public class Prueba { public Prueba() { } public static void main(String[] args) { int a, b; a=Integer.parseInt(JOptionPane.showInputDialog("Escribe un nmero")); b=Integer.parseInt(JOptionPane.showInputDialog("Escribe otro nmero")); ClaseDerivada m1 = new ClaseDerivada(a,b); JOptionPane.showMessageDialog(null,"Valor de la clase base: "+m1.getValor2()); JOptionPane.showMessageDialog(null,"Valor de la calse derivada: "+m1.getValor()); } }

Conversiones implcitas
Java permite convertir implcitamente una referencia a un objeto de una subclase en una referencia a su superclase. Ejemplo 1: public class Prueba1 { public static void main(String[] args) { CCuentaCorriente cliente1; cliente1 = new CCuentaConInt("cliente1","1245",1000,3.5); String cuenta = cliente1.obtenerCuenta(); double saldo = cliente1.obtenerSaldo(); } }

Otro ejemplo
 CCuenta cliente;   CCuentaCorriente cliente1 = new

CuentaConrriente("cliente1","1245",1000,3.5);

 CCuentaConInt cliente1 = new

CuentaConInt("cliente2","4685",2545,2.0); cliente = cliente1; String nombre = cliente.obtenerNombre(); //... cliente = cliente2; String cuenta = cliente.obtenerCuenta();

    

S-ar putea să vă placă și