Your SlideShare is downloading. ×
Herencia
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Introducing the official SlideShare app

Stunning, full-screen experience for iPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Herencia

223
views

Published on


0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
223
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. HerenciaM.C. Mario Alberto Gómez Rodríguez
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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( ) ); }}