Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Herencia

373 views

Published on

  • Be the first to comment

  • Be the first to like this

Herencia

  1. 1. HerenciaM.C. Mario Alberto Gómez Rodríguez
  2. 2. Herencia Mecanismo para extender las propiedades y comportamientos (campos ymétodos) de otras clases Creación de nuevas clases a partir de otras ya existentes Clase heredera = clase extendida o derivada Herencia simple Composición: utlizar objetos dentro de otros objetos Herencia ≠ Composición menor detalle jerarquía de clases mayor detalle
  3. 3. Herencia Superclase (Java) o Clase base (C++) Subclase (Java) o Clase derivada (C++) Java  Superclase (superclase directa)  Subclase (subclase directa)  Superclase indirecta  Subclase indirecta Herencia simple: Una clase se deriva “sólo” de una superclase (Java). Herencia múltiple: Una clase se deriva de “más de una” superclase directa(C++).
  4. 4. Herencia Superclase (Java) o Clase base (C++) Subclase (Java) o Clase derivada (C++) Java  Superclase (superclase directa)  Subclase (subclase directa)  Superclase indirecta  Subclase indirecta Herencia simple: Una clase se deriva “sólo” de una superclase (Java). Herencia múltiple: Una clase se deriva de “más de una” superclase directa(C++).
  5. 5. clase Padre campo primero; campo segundo; campo tercero; método haceAlgoUno(){...} método haceAlgoDos(){...} método haceAlgoTres(){...} clase SegundoHijo campo primero;clase PrimerHijo campo segundo;campo primero; campo tercero;campo segundo; campo adicionalSegundoHijoUno;campo tercero; campo adicionalSegundoHijoDos;campo adicionalPrimerHijoUno;campo adicionalPrimerHijoDos; método haceAlgoUno(){...} método haceAlgoDos(){...}método haceAlgoUno(){...} método haceAlgoTres(){...}método haceAlgoDos(){...} método inicializacionSegundoHijo(){...}método haceAlgoTres(){...} método impresionSegundoHijo(){...}método asignacionPrimerHijo(){...} método calculoSegundoHijo(){...}método destruccionPrimerHijo(){...} método toStringSegundoHijo(){...}
  6. 6. clase SegundoHijocampo primero;campo segundo;campo tercero;campo adicionalSegundoHijoUno;campo adicionalSegundoHijoDos;método haceAlgoUno(){...} clase ExtensionSegundoHijométodo haceAlgoDos(){...} campo primero;método haceAlgoTres(){...} campo segundo;método inicializacionSegundoHijo(){...} campo tercero;método impresionSegundoHijo(){...} campo adicionalSegundoHijoUno;método calculoSegundoHijo(){...} campo adicionalSegundoHijoDos;método toStringSegundoHijo(){...} método haceAlgoUno(){...} método haceAlgoDos(){...} método haceAlgoTres(){...} método inicializacionSegundoHijo(){...} método impresionSegundoHijo(){...} método calculoSegundoHijo(){...} método toStringSegundoHijo{...} método completarSegundoHijo(){...} método obtenerSegundoHijo(){...} método dividirSegundoHijo(){...}
  7. 7. public class Empleado { String nombre; int sueldo; public Empleado(String nombre, int sueldo) { this.nombre = nombre; casting this.sueldo = sueldo; } public void aumentarSueldo(int porcentaje) { sueldo += (int)(sueldo * porcentaje / 100); } public String toString() { return "Nombre: " + nombre + " Sueldo: " + sueldo; }}****************************************public class Ejecutivo extends Empleado { int presupuesto; public Ejecutivo(String nombre, int sueldo) { super(nombre, sueldo); } void asignarPresupuesto(int p) { presupuesto = p; }}
  8. 8. Ejecutivo jefe = new Ejecutivo( "Juan Perez", 1000);jefe.asignarPresupuesto(1500);jefe.aumentarSueldo(5);**************************************Empleado elMasRapido = new Empleado ( "Speedy Gonzalez" , 100) ;elMasRapido.asignarPresupuesto(5000); // error**************************************jefe.clone();jefe.toString();************************************** ObjectelMasRapido.clone(); EmpleadoelMasRapido.toString(); Ejecutivo
  9. 9. Redefinición de métodos • mismos nombres pero con diferente comportamientoclass Object { ... ... ...  public String toString(){ ... } ... ... ...}class Empleado { ... ... ...  public String toString(){  return "Nombre: " + nombre + " Sueldo: " + sueldo;  }}class Ejecutivo extends Empleado { ... ... ...  public String toString(){  String s = super.toString();        s = s + " Presupuesto: " + presupuesto;        return s;  }}
  10. 10. Inicialización de clases derivadas • método constructor • referencia superclass Ejecutivo extends Empleado {    int presupuesto;    Ejecutivo (String n, int s) {        super(n,s);      ... ... ...    }}***************************  public String toString(){  String s = super.toString();        s = s + " Presupuesto: " + presupuesto;        return s;  }
  11. 11. Modificadores de acceso➢public: Todo el mundo puede acceder al elemento. Si es unatributo, todo el mundo puede ver el elemento, es decir, usarlo yasignarlo. Si es un método todo el mundo puede invocarlo.➢private: Sólo se puede acceder al elemento desde métodos de laclase, o sólo puede invocarse el método desde otro método de laclase.➢protected: Sus métodos/atributos tienen acceso a nivel de clase,paquete y subclase.➢sin modificador: Se pueden acceder/invocar sus elementosdesde cualquier clase del paquete donde se define la clase.
  12. 12. Modificador protectedcombinación de public y privateacceso a clases derivadas y del mismo packageclass Empleado {    protected int sueldo;    . . .} Clase Padre datos y métodos protected datos y métodos private Clase Hija datos y métodos cualesquiera Accesibilidad de datos y métodos protected se encuentren o no dentro del mismo package
  13. 13. Clase CualquieraClase Padre datos y métodos cualesquieradatos y métodos protecteddatos y métodos private Clase HijapackageEjemploDeProtected datos y métodos de clase hijaClase Padredatos y métodos protecteddatos y métodos private Clase Hija datos y métodos cualesquierapackageEjemploDeProtected packageEjercicios
  14. 14. Resumen de modificadores Modificador Clase Package Subclase Otros public Y Y Y Y protected Y Y Y N sin modficador Y Y N N private Y N N N
  15. 15. packageUno packageDos subclase claseA subclaseA claseB claseC Visibilidad de claseAModificador ClaseA ClaseB SubclaseA claseCpublic Y Y Y Yprotected Y Y Y Nsin modficador Y Y N Nprivate Y N N N
  16. 16. packageUno packageDos packageTresclaseA claseB claseW claseY subClaseZ (hereda declaseC claseD claseX claseZ claseZ)considerar el acceso a campos y métodos (miembros)claseA y claseW tienen miembros públicosclaseB, claseY y subClaseZ tienen miembros protectedclaseC y claseX tienen miembros sin modificadorclaseD y claseZ tienen miembros private1- claseC puede acceder a claseD ? ... y viceversa ?2- claseX puede acceder a claseC ? ... y claseZ ?3- claseB puede acceder a claseD ? ... y viceversa ?4- claseA puede acceder a claseZ ? ... y viceversa ?5- claseY puede acceder a claseZ ? ... y viceversa ?6- claseZ puede acceder a claseD ? ... y viceversa ?7- claseW puede acceder a claseD ? ... y viceversa ?8- claseW puede acceder a claseA ? ... y viceversa ?9- clase subClaseZ puede acceder a claseC ? ... y a claseB ?10- clase subClaseZ puede acceder a claseD ? ... y a claseW ?
  17. 17. packageUno packageDos packageTresclaseA claseB claseW claseY subClaseZ (hereda declaseC claseD claseX claseZ claseZ)considerar el acceso a campos y métodos (miembros)claseA y claseW tienen miembros públicosclaseB, claseY y subClaseZ tienen miembros protectedclaseC y claseX tienen miembros sin modificadorclaseD y claseZ tienen miembros private1- claseC puede acceder a claseD ? ... y viceversa ? NO SI2- claseX puede acceder a claseC ? ... y claseZ ? NO NO3- claseB puede acceder a claseD ? ... y viceversa ? NO SI4- claseA puede acceder a claseZ ? ... y viceversa ? NO SI5- claseY puede acceder a claseZ ? ... y viceversa ? NO SI6- claseZ puede acceder a claseD ? ... y viceversa ? NO NO7- claseW puede acceder a claseD ? ... y viceversa ? NO SI8- claseW puede acceder a claseA ? ... y viceversa ? SI SI9- clase subClaseZ puede acceder a claseC ? ... y a claseB ? NO NO10- clase subClaseZ puede acceder a claseD ? ... y a claseW ? NO SI
  18. 18. Upcasting y downcasting (RTTI = Run-Time Type Identification)up-casting = “subir a la clase padre”down-casting = “bajar a la clase hijo”Considerar las clases Automovil y AutomovilCarrera. Suponiendo queacelerar() esté en Automovil y se haya especializado en AutomovilCarrera. Up-castingAutomovilCarrera formulaUno = new AutomovilCarrera();String stringAcelera = formulaUno.acelerar();       //para competirString stringAcelera2 = ((Automovil) formulaUno).acelerar();  //para ciudad*******************************************Automovil[] arrayAutos = { new Automovil(),  new AutomovilCarrera() };boolean valorQuitarVolante = arrayAutos[0].quitarVolante(); // ERRORboolean valorQuitarVolante2 = ((AutomovilCarrera) arrayAutos[1]).quitarVolante(); Down-casting up-casting down-casting
  19. 19. Operador castConversión de referenciasEmpleado emp = new Ejecutivo("Jefe principal" , 2000);Ejecutivo ej = (Ejecutivo)emp; // se convierte la referencia de tipoej.asignarPresupuesto(1500); // correctoej.asignarSueldo(500); // correctoEmpleado emp = new Empleado("Ricardo Castillo" , 2000);Ejecutivo ej = (Ejecutivo)emp; // incorrecto
  20. 20. Ejemplo (Punto/Circulo/Cilindro):public class Punto { Superclase de Circulo private int x; private int y; Invocación del constructor (de la misma public Punto( ){ this( 0, 0 ); clase Punto) que recibe 2 parámetros de } tipo int. public Punto(int x, int y){ Constructores this.x = x; sobrecargados this.y = y; } (Punto) public int getX( ){ “this.x” hace referencia al atributo “x” de return x; la clase. } public void setX(int x){ this.x = x; } public int getY( ){ return y; } public void setY(int y){ this.y = y; }}
  21. 21. Ejemplo (Punto/Circulo/Cilindro):public class Circulo extends Punto { Subclase de Punto y Superclase de Cilindro private double radio; public Circulo( ){ Invocación del constructor (de la misma this( 0.0 ); clase Circulo) que recibe 2 parámetros } de tipo int y un double. public Circulo(double radio){ this( 0, 0, radio ); } Constructores public Circulo(int x, int y, double radio){ sobrecargados super( x, y ); (Circulo) this.radio = radio; } Invocación del constructor (de la “super” public double getRadio( ){ clase Punto) que recibe 2 parámetros de return radio; } tipo int. public void setRadio(double radio){ this.radio = radio; } public double getDiametro( ){ return radio * 2.0; } public double getArea( ){ return Math.PI * radio * radio; } public double getCircunferencia( ){ return Math.PI * getDiametro( ); }}
  22. 22. Ejemplo (Punto/Circulo/Cilindro):public class Cilindro extends Circulo { Subclase de Circulo private double altura; public Cilindro( ){ this( 0, 0, 0.0, 0.0 ); Invocación de distintos constructores de } la misma clase Cilindro. public Cilindro(double altura){ this( 0, 0, 0.0, altura ); } Constructores public Cilindro(double radio, double altura){ sobrecargados this( 0, 0, radio, altura ); (Cilindro) } public Cilindro(int x, int y, double radio, double altura){ Invocación del constructor (de la “super” super( x, y, radio ); this.altura = altura; clase Circulo) que recibe 2 parámetros } de tipo int y un double. public double getAltura( ){ return altura; } Redefinición del método “getArea( )” public void setAltura(double altura){ heredado de la “super” clase Circulo this.altura = altura; } public double getArea( ){ return 2 * super.getArea( ) + super.getCircunferencia( ) * altura; } public double getVolumen( ){ return super.getArea( ) * altura; Invocación del método “getArea( )” de la } “super” clase Circulo}
  23. 23. Ejemplo (Punto/Circulo/Cilindro):public class Principal { public static void main(String args[]) { Cilindro cil = new Cilindro( 5, 5, 4.0, 5.0 ); System.out.println( "Area = " + cil.getArea( )); Creación y manipulación de System.out.println( "Altura = " + cil.getAltura( )); un objeto de tipo Cilindro. System.out.println( "Volumen = " + cil.getVolumen( )); }}
  24. 24. Ejemplo 2 (Punto - static):public class Punto { private int x; private int y; static private int cont = 0; Atributo “static” Punto( ){ x = 0; y = 0; ++cont; } public void setX(int x){ this.x = x; } public int getX( ){ return this.x; } public void setY(int y){ this.y = y; } public int getY( ){ return this.y; } public int getCont( ){ return this.cont; } public void setCont(int cont){ this.cont = cont; }}
  25. 25. Ejemplo 2 (Punto - static):public class Prueba { static String mensaje = "Hola!"; El método main es un método “static” public static void main(String[] args){ Punto p = new Punto( ); p.setX(5); p.setY(4); System.out.println( "X = " + p.getX( ) + ", Y = " + p.getY( ) + ", Cont = " + p.getCont( ) ); Punto p2 = new Punto( ); p2.setX(2); p2.setY(8); System.out.println( "X = " + p2.getX( ) + ", Y = " + p2.getY( ) + ", Cont = " + p2.getCont( ) ); p2.setCont(1000); Punto p3 = new Punto( ); p3.setX(3); p3.setY(9); System.out.println( "X = " + p3.getX( ) + ", Y = " + p3.getY( ) + ", Cont = " + p3.getCont( ) ); }}

×