Vous êtes sur la page 1sur 45

Tema 5

Herencia
Herencia

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

Superclase Subclases
Figura Circulo, Triangulo, Rectangulo
Empleado Docente, Administrativo
CuentaBancaria CuentaDebito, CuentaCredito
Herencia

Figura

FiguraBidimensional FiguraTridimensional

Circulo Cuadrado Triangulo Esfera Cubo Tetraedro


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 Lavadora

private int dimensionCongelador private int cantidadCiclos;

obtenerDimension(); obtenerCantidadCiclos();
obtenerIVA(); mostrarCiclos();
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(3000000, "LG", 30);
objeto1.obtenerPrecio();
objeto1.obtenerIVA();
System.exit(0);

}
}
public class UsoElectrodomestico
{
public static void main(String a[])
{
Nevera objeto1 = new Nevera(3000000, "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(3000000, "LG", 30);
objeto1.obtenerPrecio();
objeto1.obtenerIVA();
System.exit(0);

}
}

Electrodomesticos – Nevera – Lavadora -


UsoElectrodomensticos
Herencia

• 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 privatede
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 Estudiante
protected int salario; protected double promedio;
Trabajador() Estudiante()
obtenerSalario() obtenerPromedio()
aumentarSalario() cambiarPromedio()
Herencia
Persona
protected String nombre;
protected String cedula;
private String estadoCivil;
Persona()
cambiarEstadoCivil()
obtenerEstadoCivil()

Trabajador
protected int salario; Estudiante
Trabajador() protected double promedio;
obtenerSalario() Estudiante()
aumentarSalario() obtenerPromedio()
cambiarPromedio()

Docente NoDocente
protected int puntuacion; protected int cantidadSalariosM;
Docente() NoDocente()
aumentarPuntuacion() obtenerSalario()*
obtenerSalario()*
*Sobrescrito
Herencia

• 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:

Clase Circulo Clase Cilindro


Herencia

Considere el siguiente ejemplo:

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
La clase Cilindro
{ hereda de la clase
private double altura; Circulo
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 para utilizar el
{
constructor de la
super(r); superclase, en este caso
altura=a; el de la clase Circulo
}
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;
Como ya existe un método llamado
} obtenerArea en la superclase, se
public double obtenerArea() sobrescribe de tal forma que el área
{ se calcule ahora para un cilindro

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();

}
Se hace referencia al
public double obtenerVolumen() método obtenerArea de
{ la superclase. Como
return super.obtenerArea()*altura; existe en esta clase con
el mismo nombre, se
}
utiliza super
}
public class Cilindro extends Circulo
{
private double altura; No se necesita utilizar
public Cilindro(double r, double a) super porque no existe
en esta clase un método
{
que se llame igual
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;
}
}
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()
{
radio es un atributo privado en
return radio;
Circulo, solo se puede acceder a
} través de métodos public
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; Genera error de compilación
}
Cilindro1-Circulo
public double obtenerArea()
{

return obtenerPerimetro()*altura + 2*super.obtenerArea();


}
}
Herencia

Problema: considere la siguiente jerarquía de clases

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;
}
}
import javax.swing.*;
public class ClaseA{
private int x;
public class ClaseB extends ClaseA{
protected int y;
private int z;

public ClaseA(int x, int y){


public ClaseB(int x, int y, int z){
this.x=x;
super(x,y);
this.y=y;
this.z=z;
}
}
public double obtenerX(){
public void mostrarY(){
return x;
JOptionPane.showMessageDialog(null, "El valor del
}
atributo protected Y es: " + y );
public double obtenerY(){
}
return y;
}
}
}

¿Se genera un error de


compilación?
import javax.swing.*;
public class ClaseA{
private int x;
public class ClaseB extends ClaseA{
protected int y;
private int z;

public ClaseA(int x, int y){


public ClaseB(int x, int y, int z){
this.x=x;
super(x,y);
this.y=y;
this.z=z;
}
}
public double obtenerX(){
public void mostrarY(){
return x;
JOptionPane.showMessageDialog(null, "El valor del
}
atributo protected Y es: " + y );
public double obtenerY(){
}
return y;
}
}
}

¿Se genera un error de compilación?


No, ver ClaseA, ClaseB, UsoB
import javax.swing.*;
public class ClaseA{
private int x;
public class ClaseB extends ClaseA{
protected int y;
private int z;

public ClaseA(int x, int y){


public ClaseB(int x, int y, int z){
this.x=x;
super(x,y);
this.y=y;
this.z=z;
}
}
public double obtenerX(){
public void mostrarX(){
return x;
JOptionPane.showMessageDialog(null, "El valor del
}
atributo private X es: " + x );
public double obtenerY(){
}
return y;
}
}
}

¿Se genera un error de


compilación?
Herencia

• Problema: Desarrolle la siguiente jerarquía de clases en Java

Empleado
Nombre
Cedula
Dependencia

Docente Administrativo
CalificacionAsignada SalarioBase
Salario

calcularSalario()
calcularSalario()

ProfesorTiempoCo ProfesorHoraCatedra RecursosHumanos Mantenimiento


mpleto horasAsignadas Tipo (tesorería, SalonesAsignados[]
totalHorasInvestigacion secretaría) HorasExtra
calcularSalario() calcularSalario() calcularSalario()
calcularSalario()
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 150.000 al mes
•Para los profesores tiempo completo, se considera que si el nivel
estudio es pregrado se tiene un salario base de 1600000, si es de
maestría, 2000000 y doctorado 4000000. Además, si tiene docencia
destacada, se aumenta a este salario base 200000. Para obtener la
docencia destacada su calificación debe superar la nota4.5
Herencia

•El salario base del personal administrativo es 700000


•De acuerdo al tipo de recursos humanos, se aumenta el salario base
100000 si se es de tesorería y 70000 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