Tema 5 H erencia. La herencia es una forma de reutilización de software en la que las clases se crean incorporando los datos (atributos) y el comportamiento.

Slides:



Advertisements
Presentaciones similares
Curso de java básico (scjp)
Advertisements

Clases en C++.
Lenguaje de programación Java
Herencia y Polimorfismo
HERENCIA.
Tema 7: Polimorfismo Antonio J. Sierra. Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos.
Herencia e Interfaces.
Herencia y Polimorfismo en JAVA
UNIDAD 2 CLASES Y OBJETOS. CLASE Elementos cabecera y cuerpo de la clase. Cabecera: aporta información fundamental sobre la clase en sí y constituye de.
Capitulo # 4 herencia PROGRAMACION III UNIVERSIDAD
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Encapsulamiento.
INTRODUCCIÓN A LA PROGRAMACIÓN ORIENTADA A OBJETOS Encapsulamiento.
Metodología de Programación Ayudantía 4 lelagos.ublog.cl 2008.
UNIDAD VI Recursos esenciales de Java LSC. Natalia Rodríguez Castellón.
Metodología de Programación Ayudantía 5 lelagos.ublog.cl 2009.
HERENCIA.
Abstracción El concepto de abstracción es esencial en ciencias de la computación. Un programa es en sí mismo una abstracción, un modelo de la resolución.
RELACIONES ENTRE CLASES M.C. YOLANDA MOYAO MARTINEZ.
Diagrama de Clases SPI 2016.
2012-BM5A. Introducción Todos los lenguajes de programación son distintos entre si. Sin embargo, pueden ser agrupados según la forma de pensar y estructurar.
Tema 2 : Java Básico Clase Práctica 5 (Conferencia 4)
PROGRAMACIÓN ORIENTADA A OBJETOS Encapsulamiento y constructores.
PROGRAMACIÓN ORIENTADA A OBJETOS SEGUNDA UNIDAD: “CLASES, OBJETOS Y MÉTODOS” IRVING YAIR SALAS CHÁVEZ ING. EN SISTEMAS COMPUTACIONALES - ITSLP.
Clases y Objetos en Java
Unidad Didáctica 11 Reutilización Versión 1.0.0
Ingeniería Directa. Generar código a través de modelos se le conoce como ingeniería directa.
Clases y Objetos.
Herencia y Clases Abstractas
Diseño y Programación Orientada a Objetos
Herencia Implementación en Java.
EL MUNDO DE LOS OBJETOS PROGRAMANDO EN JAVA.
Figura Rectangulo Elipse Cuadrado Circulo area (): double
Fundamentos de la programación orientada a objetos
Clase 11: Herencia 21-enero (J.Alvarez).
¿Qué es una clase? Las clases en Java son básicamente una plantilla (tipo o prototipo) que sirve para crear un objeto. Si imaginásemos las clases en el.
Medio de tele-comunicación
Clases y Objetos en Java
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Objeto de clase Fracción métodos públicos representación privada constructor Fraccion(…) asigna a procedimiento void m(…) modifica b función tipo/clase.
Programación orientada a objetos
Clase 11: Herencia 15-abril (J.Alvarez).
Sonia Rueda Herencia y Polimorfismo
Clases y Objetos en Java
Programación Orientada a Objetos I Unidad 4 Relaciones entre clases: herencia.
Herencia Agustín J. González ELO329.
Fundamentos del lenguaje de programación Condicionales, ciclos, Métodos, enumeraciones Escuela Técnica Superior Kinal Instructor Edwin Tumax.
Herencia en C#.
HERENCIA.
Ingeniero en Computación José Alfredo Cobián Campos
Clase 11: Herencia 15-abril (J.Alvarez).
Fundamentos básicos del lenguaje C#. Parte 1 Introducción a C#
Programación Orientada a Objetos
M.C Alejandro Castellanos Lopez
Herencia en C++ Agustín J. González ELO329.
Tópicos Avanzados de Programación (TAP3501)
Clases en Java 1 Métodos de Programación II Profesor: M.C. Alfonso Miguel Uriarte Gálvez.
Herencia en C++ Agustín J. González ELO329.
Clase 11: Herencia 15-abril (J.Alvarez).
Clase 11: Herencia 15-abril (J.Alvarez).
Clase 11: Herencia 21-enero (J.Alvarez).
Herencia en C++ Agustín J. González ELO329.
Herencia en C++ Agustín J. González ELO329.
Herencia en C++ Agustín J. González ELO329.
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Funciones y Clases Amigas (Friend)‏ Miembros Estáticos (Static)
Herencia Agustín J. González ELO329.
Herencia en C++ Agustín J. González ELO329.
Clases abstractas e interfaces
Clases y Objetos en Java
Transcripción de la presentación:

Tema 5 H erencia

La herencia es una forma de reutilización de software en la que las clases se crean incorporando los datos (atributos) y el comportamiento (métodos) de una clase existente Herencia

- Una subclase es más específica que una superclase y representa a un conjunto más especializado de objetos - La subclase puede eventualmente ser una superclase de otra clase. - La superclase directa es la clase a partir de la cual la subclase hereda de forma explicita Herencia

Herencia simple: una clase se deriva de una superclase Herencia múltiple: una clase se deriva de más de una superclase directa Java no soporta herencia múltiple!!! Herencia

Las subclases son clases más especializadas SuperclaseSubclases FiguraCirculo, Triangulo, Rectangulo EmpleadoDocente, Administrativo CuentaBancariaCuentaDebito, CuentaCredito Herencia

Figura FiguraBidimensionalFiguraTridimensional CirculoCuadradoTrianguloEsferaCuboTetraedro Herencia

Miembros protected El modificador de acceso protected permite que los miembros definidos en una clase con este modificador sean utilizados por: -Los miembros de esa clase (la superclase en este caso) -Las clases que hereden de ella (las subclases) -Las clases en el mismo paquete Herencia

Miembros protected El modificador de acceso protected permite que los miembros definidos en una clase con este modificador sean utilizados por: -Los miembros de esa clase (la superclase en este caso) -Las clases que hereden de ella (las subclases) -Las clases en el mismo paquete * A diferencia de public, un atributo protected no puede ser accedido por una clase en un paquete diferente en el cual fue definido Herencia

Electrodoméstico protected double precio; protected String marca; apagar() encender() Nevera private int dimensionCongelador obtenerDimension(); obtenerIVA(); Lavadora private int cantidadCiclos; obtenerCantidadCiclos(); mostrarCiclos(); Herencia

import javax.swing.*; public class Electrodomestico{ protected int precio; protected String marca; public Electrodomestico(int p, String m){ precio = p; marca = m; } public void obtenerPrecio(){ JOptionPane.showMessageDialog(null, "Precio: " + precio); } public void obtenerMarca(){ JOptionPane.showMessageDialog(null, "Marca: " + marca); } public void apagar(){ System.out.println("El electrodomestico se apagará"); }

import javax.swing.*; public class Nevera extends Electrodomestico{ private int dimensionCongelador; public Nevera(int p, String m, int d){ super(p,m); dimensionCongelador = d; } public int obtenerDimension(){ return dimensionCongelador; } public void obtenerIVA() { JOptionPane.showMessageDialog(null, "IVA: " + (precio * 0.16) ); }

import javax.swing.*; public class Nevera extends Electrodomestico{ private int dimensionCongelador; public Nevera(int p, String m, int d){ super(p,m); dimensionCongelador = d; } public int obtenerDimension(){ return dimensionCongelador; } public void obtenerIVA() { JOptionPane.showMessageDialog(null, "IVA: " + (precio * 0.16) ); } } Se pueden usar las variables definidas en la superclase como si hicieran parte de esta clase

public class UsoElectrodomestico { public static void main(String a[]) { Nevera objeto1 = new Nevera( , "LG", 30); objeto1.obtenerPrecio(); objeto1.obtenerIVA(); System.exit(0); }

public class UsoElectrodomestico { public static void main(String a[]) { Nevera objeto1 = new Nevera( , "LG", 30); objeto1.obtenerPrecio(); objeto1.obtenerIVA(); System.exit(0); } Se pueden usar los métodos definidos en la superclase como si hicieran parte de esta clase

public class UsoElectrodomestico { public static void main(String a[]) { Nevera objeto1 = new Nevera( , "LG", 30); objeto1.obtenerPrecio(); objeto1.obtenerIVA(); System.exit(0); } Electrodomesticos – Nevera – Lavadora- UsoElectrodomensticos

Miembros protected Todos los miembros public y protected de una superclase mantienen su modificador de acceso original cuando se convierten en miembros de un subclase Una subclase puede efectuar cambios en los miembros private de la superclase SOLO a través de los métodos no private que se proporcionen en la superclase Herencia

Sobrescritura de métodos Cuando se hereda de una superclase, sus métodos y variables llegan a ser parte de la subclase (cuidando los casos private). Sin embargo, en la subclase se puede definir nuevamente métodos que se llamen igual, esto se conoce como sobrescritura de métodos Herencia

Persona protected String nombre; protected String cedula; private String estadoCivil; Persona() cambiarEstadoCivil(String nuevo) obtenerEstadoCivil() Trabajador protected int salario; Trabajador() obtenerSalario() aumentarSalario(int aumento) Herencia

Persona protected String nombre; protected String cedula; private String estadoCivil; Persona() cambiarEstadoCivil() obtenerEstadoCivil() Trabajador protected int salario; Trabajador() obtenerSalario() aumentarSalario() Estudiante protected double promedio; Estudiante() obtenerPromedio() cambiarPromedio() Herencia

Persona protected String nombre; protected String cedula; private String estadoCivil; Persona() cambiarEstadoCivil() obtenerEstadoCivil() Trabajador protected int salario; Trabajador() obtenerSalario() aumentarSalario() Estudiante protected double promedio; Estudiante() obtenerPromedio() cambiarPromedio() Herencia Docente protected int puntuacion; Docente() aumentarPuntuacion() obtenerSalario()* NoDocente protected int cantidadSalariosM; NoDocente() obtenerSalario()* *Sobrescrito

Super Permite especificar que se quiere utilizar un método de la superclase. Es útil cuando se sobrescriben métodos Herencia

Considere el siguiente ejemplo: Herencia Clase Circulo Clase Cilindro

Considere el siguiente ejemplo: Herencia Clase Circulo Clase Cilindro La clase Cilindro puede heredar de Círculo el método para calcular el área de un círculo y el radio. Tendrá que completar la definición con el atributo altura

public class Circulo { private double radio; public Circulo(double r) { radio=r; } public double obtenerRadio() { return radio; } public double obtenerArea() { return Math.PI*radio*radio; } public double obtenerPerimetro() { return 2*Math.PI*radio; }

public class Cilindro extends Circulo { private double altura; public Cilindro(double r, double a) { super(r); altura=a; } public double obtenerAltura() { return altura; } public double obtenerArea() { return obtenerPerimetro()*altura + 2*super.obtenerArea(); } public double obtenerVolumen() { return super.obtenerArea()*altura; }

public class Cilindro extends Circulo { private double altura; public Cilindro(double r, double a) { super(r); altura=a; } public double obtenerAltura() { return altura; } public double obtenerArea() { return obtenerPerimetro()*altura + 2*super.obtenerArea(); } public double obtenerVolumen() { return super.obtenerArea()*altura; } La clase Cilindro hereda de la clase Circulo

public class Cilindro extends Circulo { private double altura; public Cilindro(double r, double a) { super(r); altura=a; } public double obtenerAltura() { return altura; } public double obtenerArea() { return obtenerPerimetro()*altura + 2*super.obtenerArea(); } public double obtenerVolumen() { return super.obtenerArea()*altura; } super para utilizar el constructor de la superclase, en este caso el de la clase Circulo

public class Cilindro extends Circulo { private double altura; public Cilindro(double r, double a) { super(r); altura=a; } public double obtenerAltura() { return altura; } public double obtenerArea() { return obtenerPerimetro()*altura + 2*super.obtenerArea(); } public double obtenerVolumen() { return super.obtenerArea()*altura; } Como ya existe un método llamado obtenerArea en la superclase, se sobrescribe de tal forma que el área se calcule ahora para un cilindro

public class Cilindro extends Circulo { private double altura; public Cilindro(double r, double a) { super(r); altura=a; } public double obtenerAltura() { return altura; } public double obtenerArea() { return obtenerPerimetro()*altura + 2*super.obtenerArea(); } public double obtenerVolumen() { return super.obtenerArea()*altura; } } Se hace referencia al método obtenerArea de la superclase. Como existe en esta clase con el mismo nombre, se utiliza super

public class Cilindro extends Circulo { private double altura; public Cilindro(double r, double a) { super(r); altura=a; } public double obtenerAltura() { return altura; } public double obtenerArea() { return obtenerPerimetro()*altura + 2*super.obtenerArea(); } public double obtenerVolumen() { return super.obtenerArea()*altura; } No se necesita utilizar super porque no existe en esta clase un método que se llame igual

import javax.swing.*; public class UsoCilindro { public static void main(String a[]) { JTextArea miArea=new JTextArea(10,25); JScrollPane miScroll=new JScrollPane(miArea); Cilindro unCilindro=new Cilindro(1.0, 5.0); miArea.append("Datos del cilindro"); miArea.append("\nRadio de la base: " + unCilindro.obtenerRadio()); miArea.append("\nAltura: " + unCilindro.obtenerAltura()); miArea.append("\nArea: " + unCilindro.obtenerArea()); miArea.append("\nVolumen: " + unCilindro.obtenerVolumen()); JOptionPane.showMessageDialog(null, miScroll); System.exit(0); }

import javax.swing.*; public class UsoCilindro { public static void main(String a[]) { JTextArea miArea=new JTextArea(10,25); JScrollPane miScroll=new JScrollPane(miArea); Cilindro unCilindro=new Cilindro(1.0, 5.0); miArea.append("Datos del cilindro"); miArea.append("\nRadio de la base: " + unCilindro.obtenerRadio()); miArea.append("\nAltura: " + unCilindro.obtenerAltura()); miArea.append("\nArea: " + unCilindro.obtenerArea()); miArea.append("\nVolumen: " + unCilindro.obtenerVolumen()); JOptionPane.showMessageDialog(null, miScroll); System.exit(0); } } Método heredado, no fue creado en la Clase Cilindro, se usa como si hiciera parte de esa clase

import javax.swing.*; public class UsoCilindro { public static void main(String a[]) { JTextArea miArea=new JTextArea(10,25); JScrollPane miScroll=new JScrollPane(miArea); Cilindro unCilindro=new Cilindro(1.0, 5.0); miArea.append("Datos del cilindro"); miArea.append("\nRadio de la base: " + unCilindro.obtenerRadio()); miArea.append("\nAltura: " + unCilindro.obtenerAltura()); miArea.append("\nArea: " + unCilindro.obtenerArea()); miArea.append("\nVolumen: " + unCilindro.obtenerVolumen()); JOptionPane.showMessageDialog(null, miScroll); System.exit(0); } } Método sobrescrito

import javax.swing.*; public class UsoCilindro { public static void main(String a[]) { JTextArea miArea=new JTextArea(10,25); JScrollPane miScroll=new JScrollPane(miArea); Cilindro unCilindro=new Cilindro(1.0, 5.0); miArea.append("Datos del cilindro"); miArea.append("\nRadio de la base: " + unCilindro.obtenerRadio()); miArea.append("\nAltura: " + unCilindro.obtenerAltura()); miArea.append("\nArea: " + unCilindro.obtenerArea()); miArea.append("\nVolumen: " + unCilindro.obtenerVolumen()); JOptionPane.showMessageDialog(null, miScroll); System.exit(0); } } Método sobrescrito Cilindro-Circulo-UsoCilindro

public class Cilindro1 extends Circulo { private double altura; public Cilindro1(double r, double a) { super(r); altura=a; } public double obtenerAltura() { return altura; } public double obtenerRadio() { return radio; } public double obtenerArea() { return obtenerPerimetro()*altura + 2*super.obtenerArea(); }

public class Cilindro1 extends Circulo { private double altura; public Cilindro1(double r, double a) { super(r); altura=a; } public double obtenerAltura() { return altura; } public double obtenerRadio() { return radio; } public double obtenerArea() { return obtenerPerimetro()*altura + 2*super.obtenerArea(); } radio es un atributo privado en Circulo, solo se puede acceder a través de métodos public

public class Cilindro1 extends Circulo { private double altura; public Cilindro1(double r, double a) { super(r); altura=a; } public double obtenerAltura() { return altura; } public double obtenerRadio() { return radio; } public double obtenerArea() { return obtenerPerimetro()*altura + 2*super.obtenerArea(); } Genera error de compilación Cilindro1-Circulo

Problema: considere la siguiente jerarquía de clases Herencia ClaseA private int x; protected int y; ClaseA(int x, int y) obtenerX() obtenerY() ClaseB private int z; ClaseB(int x, int y, int z) mostrarY()

public class ClaseA{ private int x; protected int y; public ClaseA(int x, int y){ this.x=x; this.y=y; } public double obtenerX(){ return x; } public double obtenerY(){ return y; }

public class ClaseA{ private int x; protected int y; public ClaseA(int x, int y){ this.x=x; this.y=y; } public double obtenerX(){ return x; } public double obtenerY(){ return y; } import javax.swing.*; public class ClaseB extends ClaseA{ private int z; public ClaseB(int x, int y, int z){ super(x,y); this.z=z; } public void mostrarY(){ JOptionPane.showMessageDialog(null, " El valor del atributo protected Y es: " + y ); } } ¿Se genera un error de compilación?

public class ClaseA{ private int x; protected int y; public ClaseA(int x, int y){ this.x=x; this.y=y; } public double obtenerX(){ return x; } public double obtenerY(){ return y; } import javax.swing.*; public class ClaseB extends ClaseA{ private int z; public ClaseB(int x, int y, int z){ super(x,y); this.z=z; } public void mostrarY(){ JOptionPane.showMessageDialog(null, " El valor del atributo protected Y es: " + y ); } ¿Se genera un error de compilación? No, ver ClaseA, ClaseB, UsoB

public class ClaseA{ private int x; protected int y; public ClaseA(int x, int y){ this.x=x; this.y=y; } public double obtenerX(){ return x; } public double obtenerY(){ return y; } import javax.swing.*; public class ClaseB extends ClaseA{ private int z; public ClaseB(int x, int y, int z){ super(x,y); this.z=z; } public void mostrarX(){ JOptionPane.showMessageDialog(null, " El valor del atributo private X es: " + x ); } } ¿Se genera un error de compilación?

Empleado Nombre Cedula Dependencia Docente CalificacionAsignada Salario calcularSalario() Administrativo SalarioBase calcularSalario() ProfesorTiempoCo mpleto totalHorasInvestigacion calcularSalario() ProfesorHoraCatedra horasAsignadas calcularSalario() RecursosHumanos Tipo (tesorería, secretaría) calcularSalario() Mantenimiento SalonesAsignados[] HorasExtra calcularSalario() Problema: Desarrolle la siguiente jerarquía de clases en Java Herencia

Problema: Tenga en cuenta las siguientes especificaciones Dependencia indica la escuela a la que pertenece (EISC, EIEE, entre otras) calificacionAsignada es la calificación promedio que tiene cada profesor con base en las evaluaciones de los cursos que ha dictado El salario de los profesores hora cátedra se calcula considerando que por hora asignada se reconocen al mes Para los profesores tiempo completo, se considera que si el nivel estudio es pregrado se tiene un salario base de , si es de maestría, y doctorado Además, si tiene docencia destacada, se aumenta a este salario base Para obtener la docencia destacada su calificación debe superar la nota 4.5 Herencia

El salario base del personal administrativo es De acuerdo al tipo de recursos humanos, se aumenta el salario base si se es de tesorería y si es de secretaria El personal de mantenimiento tiene una lista con los nombres de los salones que tiene asignado Puede trabajar horas extra, por cada hora extra se aumenta 4000 al salario Herencia