Está en la página 1de 21

Universidad Nacional Ingeniería de Sistemas

de Trujillo

Herencia

Curso: Tecnología de la Programación I.


Docente: Mg. Zoraida Yanet Vidal Melgarejo.

CLASE 04

Herencia

Podemos definir la herencia como la


capacidad de crear clases que
adquieran de manera automática los
atributos y métodos de otras clases
que ya existen, pudiendo al mismo
tiempo añadir atributos y métodos
propios.

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 1
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Ventajas de la Herencia
Entre las principales ventajas que ofrece la herencia en el desarrollo de
aplicaciones están:

• Reutilización de código. En aquellos casos donde se necesite crear una


clase que, además de métodos propios, debe incluir los métodos definidos
en otra, la herencia evita tener que reescribir todos esos métodos en la
nueva clase.

• Mantenimiento de Aplicaciones existentes. Utilizando la herencia, si


tenemos una clase con una determinada funcionalidad y tenemos la
necesidad de ampliar dicha funcionalidad, no necesitamos modificar la clase
existente (la cual se puede seguir utilizando para el tipo de programa que
fue diseñada) sino que podemos crear una clase que herede a la primera,
adquiriendo toda su funcionalidad y añadiendo la suya propia.

Nomenclatura y Reglas
 En POO, a la clase que va a ser heredada se le llama clase padre,
superclase o clase base, mientras que a la que hereda se le conoce
como clase hija, subclase o clase derivada.

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 2
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Nomenclatura y Reglas
 Utilizando la notación UML, la herencia entre dos clases se representa
como una flecha saliendo de la subclase hacia la superclase.

Clase Padre

Generalización/Especialización

Clase Hija

La Relacion “es un”


• La herencia entre dos clases establece una relación entre las mismas de
tipo “es un”, lo que significa que un objeto de una subclase también “es un”
objeto de la superclase.

• Por ejemplo, Vehículo es una superclase de Automóvil, por lo que un


automóvil “es un” Vehículo. De la misma forma Animal es la superclase de
Mamífero y esta a su vez superclase de León, esto nos lleva a que León “es
un” Mamífero y “es un” animal.

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 3
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Reglas Básicas
Hay unas reglas básicas sobre la herencia en Java que hay que tener presentes
• En Java se implementa la herencia simple.
• En Java no se puede implementar la herencia Múltiple, aunque puede
simularse.
• Si es posible la herencia multinivel, es decir, A puede ser Heredada por B y
B puede ser heredada por C.
• Una clase puede ser heredada por varias clases: una clase padre puede
tener varias clases hijas.

Creación de Herencia en Java


A la hora de definir una clase que va a heredar de otra clase se utiliza la
palabra extends, seguida del nombre de la superclase en la cabecera de la
declaración:

public class SubClase extends SuperClase {


// código de la subclase
}

La nueva clase podrá incluir atributos y métodos propios para completar su


función.

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 4
Universidad Nacional Ingeniería de Sistemas
de Trujillo

La Clase Object
Todas las clases de Java heredan alguna clase. En caso de que no se
especifique mediante extends la clase que se va a heredar, implícitamente
hereda de Object.

Esta clase se encuentra en el paquete java.lang y proporciona el soporte


básico para cualquier clase Java.

Así pues, la definición de una clase que no herede explícitamente a otra


equivale a:
public class NombreClase extends Object {
// código de la clase
}

La clase Object es, por tanto, la superclase de todas las clases de Java.

Ejecución de constructores con la herencia


 Hay que hacer especial mención al comportamiento de los constructores
de la superclase y subclase cuando se va a crear un objeto de esta última.

 Como norma universal, cada vez que en Java se crea un objeto de una clase,
antes de ejecutarse el constructor de dicha clase se ejecutará primero el
de su superclase.

Esto se puede verificar al observar la ejecución del método main() del


siguiente programa:

10

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 5
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Ejemplo de herencia
public class Primera {
public Primera() {
System.out.println(“Constructor de la superclase”);
}
}

public class Segunda extends Primera {


public Segunda() {
System.out.println(“Constructor de la subclase”);
}
}

11

Ejemplo de herencia
public class Principal {
public static void main(String args[]) {
Segunda s = new Segunda();
}
}

Aparecerá en la pantalla:

Constructor de la superclase
Constructor de la subclase

12

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 6
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Ejemplo de herencia
La explicación a esta situación la tenemos en el hecho de que el compilador
java, añade, como primera línea de código en todos los constructores de una
clase la siguiente instrucción:
super();

Instrucción que provoca una llamada al constructor sin parámetros de la


superclase.

Los constructores por defecto también incluyen esta instrucción, así pues, el
aspecto real de estos constructores es:
public NombreClase() {
super();
}

13

Ejemplo de herencia
Si en vez de llamar al constructor sin parámetros quisiéramos invocar a
cualquier otro constructor de la superclase, deberíamos hacerlo
explícitamente, añadiendo como primera línea del constructor de la subclase
la instrucción:
super(argumentos)

Los argumentos son los parámetros que necesita el constructor de la


superclase que se desea invocar. Esto permite entre otras cosas, que el
constructor de la subclase pueda pasarle al constructor de la superclase los
datos necesarios para la inicialización de los atributos privados y que no son
accesibles desde la subclase.

14

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 7
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Métodos y atributos Protegidos


 Existe un modificador de acceso aplicable a atributos y métodos de una
clase, pensando para ser utilizado con la herencia. Se trata del modificador
protected.

 Un miembro de una clase (atributo o método) definido como protected


será accesible desde cualquier subclase de ésta, independientemente de los
paquetes en que estas clases se encuentren.

15

Sobreescritura de Métodos
Cuando una clase hereda de otra, el comportamiento de los métodos que
hereda no siempre se ajusta a las necesidades de la nueva clase. En estos
casos, la subclase puede optar por volver a reescribir el método
heredado, es lo que se conoce como sobreescritura de un método.

A la hora de sobrescribir un método hay que tener en cuenta las siguientes


reglas:

16

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 8
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Reglas para la Sobreescritura de Métodos


• Cuando se sobrescribe un método en una subclase, éste debe tener
exactamente el mismo formato que el método de la superclase que
sobrescribe. Esto significa que deben llamarse igual, tener los mismos
parámetros y mismo tipo de devolución.

public class Primera {


public String toString() {
System.out.println(“Esta es la superclase”);
}
}
public class Segunda extends Primera {
public String toString() {
System.out.println(“Esta es la subclase”);
}
}

17

Reglas para la Sobreescritura de Métodos


• Hay que tener presente si al intentar sobrescribir un método en una
subclase se mantiene el mismo nombre y se modifican los parámetros, el
nuevo método no sobrescribe al de la superclase pero tampoco ocurre un
error de compilación, ya que estaríamos en un caso de sobrecarga de
métodos: dos métodos con el mismo nombre y distintos parámetros.

public class Primera {


public int suma(int x, int y) {
return x + y;
}
} public class Segunda extends Primera {
public int suma(int x, int y, int z) {
return x + y + z;
}
}
18

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 9
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Reglas para la Sobreescritura de Métodos


• El método sobrescrito puede tener un modificador de acceso menos
restrictivo que el de la superclase. Por ejemplo, el método de la superclase
puede ser protected y la versión sobrescrita en la subclase puede ser
public, pero nunca uno más restrictivo.

public class Primera {


protected String toString() {
System.out.println(“Esta es la superclase”);
}
} public class Segunda extends Primera {
public String toString() {
System.out.println(“Esta es la subclase”);
}
}
19

Reglas para la Sobreescritura de Métodos


• Para llamar desde el interior de la subclase a la versión original del método
de la superclase, debe utilizarse la expresión:
super.nombreMetodo(argumentos);

Si no se utiliza super delante del nombre del método, se llamará a la


versión sobrescrita de la clase.

20

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 10
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Ejemplo de Herencia Simple


 La empresa XYZ requiere una aplicación informática para administrar los
datos de su personal.
 Del personal se conoce: número de DNI, nombre, apellidos y fecha de
ingreso.
 Existen dos categorías de personal: el personal contratado y el personal a
destajo. Los empleados contratados tienen un sueldo básico y un
porcentaje adicional en función al tiempo laborado: de 0 a 3 años: 5%; de 4
a 7 años: 10%; de 8 a 15 años: 15% y más de 15 años: 20%
 Los empleados a destajo tienen un número de clientes captados y un
monto por cliente captado.

21

Clases Finales
Si queremos evitar que una clase sea heredada por otra, deberá ser declarada
con el modificador final delante de class:
public final class ClaseA {
….
}

Si otra clase intenta heredar una clase final se producirá un error de


compilación. Por ejemplo esta clase no compilará:
public class ClaseB extends ClaseA {
// código de la ClaseB
}

22

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 11
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Métodos abstractos
 Tenemos un método f() aplicable a todos los objetos de la clase A.
 Área de un polígono.

 La implementación del método es completamente diferente en cada


subclase de A.
 Área de un triángulo.
 Área de un rectángulo.

 Para declarar un método como abstracto, se pone delante la palabra


reservada abstract y no define un cuerpo:
abstract tipo nombreMétodo(....);

 Luego en cada subclase se define un método con la misma cabecera y


distinto cuerpo.

23

Clases Abstractas
 Si una clase contiene al menos un método abstracto, entonces es una clase
abstracta.
 Una clase abstracta es una clase de la que no se pueden crear objetos,
pero puede ser utilizada como clase padre para otras clases.
 Declaración:
public abstract class NombreClase {
..............
}

24

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 12
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Ejemplo de clase abstracta


persona
Persona
-nombre
-edad
+toString() : String
+cambiarEdad()

Alumno
alumno
-curso profesor
Profesor
-nivelAcademico -asignatura
+cambiarCurso() +toString() : String
+toString() : String
+pagoMensual() : double
+mostrarAsignaturas()

libre
Libre presencial
Presencial
-listaAsignaturas -matriculaCurso
-precioPorHora -noConvocatoria
-noHorasDiarias -plusPorConvocatoria
-pedirAsignaturas() +pagoMensual() : double
+pagoMensual() : double +mostrarAsignaturas()
+mostrarAsignaturas()
25

Ejemplo de clase abstracta

public abstract class Alumno extends Persona {


protected int curso;
private String nivelAcademico;
public Alumno (String n, int e, int c, String nivel) {
super(n, e);
curso = c; nivelAcademico = nivel;
}
public String toString() {
return super.toString() + curso + nivelAcademico;
}
public abstract double pagoMensual();
public abstract String getAsignaturas();
}

26

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 13
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Ejemplo de clase abstracta


public class Libre extends Alumno {
private String []listaDeAsignaturas;
private static float precioPorHora=10;
private int noHorasDiarias;

private void pedirAsignaturas() {


// se inicializa listaDeAsignaturas
}

public double pagoMensual() {


return precioPorHora*noHorasDiarias*30;
}

27

Ejemplo de clase abstracta


public String getAsignaturas() {
String asignaturas="";
for (int i=0; i<listaDeAsignaturas.length; i++)
asignaturas += listaDeAsignaturas[i] + ' ';
return asignaturas;
}

public Libre(String n, int e, int c, String nivel, int horas) {


super(n,e,c,nivel);
noHorasDiarias = horas;
pedirAsignaturas();
}
}

28

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 14
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Ejemplo de clase abstracta


public class Presencial extends Alumno {
private double matriculaCurso;
private double plusPorConvocatoria;
private int noConvocatoria;

public double pagoMensual() {


return
(matriculaCurso+plusPorConvocatoria*noConvocatoria)/12;
}

public String getAsignaturas(){


return “todas las del curso “ + curso;
}

29

Ejemplo de clase abstracta


public Presencial(String n, int e, int c, String nivel,
double mc, double pc, int nc) {
super(n,e,c,nivel);
matriculaCurso=mc;
plusPorConvocatoria=pc;
noConvocatoria=nc;
}
}

30

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 15
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Ejemplo de clase abstracta

// Métodos que generan enlace dinámico


void mostrarAsignaturas(Alumno v[]) {
for (int i=0; i<v.length; i++)
System.out.println(v[i].getAsignaturas()); // enlace dinámico
}

double totalPagos(Alumno v[]) {


double t=0;
for (int i=0; i<v.length; i++)
t += v[i].pagoMensual(); // enlace dinámico
return t;
}

31

Interfaces
 Podría suceder que los objetos de varias clases compartan la capacidad de
ejecutar un cierto conjunto de operaciones.
 Y dependiendo de la clase de objeto, cada operación se realice de diferente
manera.
 Ejemplo:
 Clases: Circulo, Elipse,Triangulo, ....
 Todas esas clases incluyen los métodos: área, perimetro, cambiarEscala,
etc.
 Podríamos definir una interfaz común que agrupe todos los métodos
comunes (como métodos abstractos).
 Y luego definir varias clases de modo que implementen una misma interfaz.

32

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 16
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Ejemplo de Interface

public interface Figura {


public double area();
public double perimetro();
}

33

Ejemplo de Interface
public class Cuadrado implements Figura {
private double lado;

public Cuadrado(double lado) {


this.lado = lado;
}
public double area() {
return lado*lado;
}
public double perimetro() {
return 4*lado;
}
}

34

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 17
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Ejemplo de Interface
public class Circulo implements Figura {
private double radio;
private final double PI=3.1416;

public Circulo(double radio) {


this.radio = radio;
}
public double area() {
return PI*radio*radio;
}
public double perimetro() {
return 2*PI*radio;
}
}

35

Interfaces
• Se pueden declarar referencias a objetos que implementen una cierta
interfaz.

double totalArea(Figura v[]) {


double t=0;
for (int i=0; i<v.length; i++)
t += v[i].area(); // enlace dinámico
return t;
}

36

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 18
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Interfaces

• Una interfaz puede incluir


también definiciones de
constantes aparte de
métodos abstractos.
• Una misma clase puede
implementar más de una
interfaz  Herencia
múltiple de interfaces

37

Herencia entre Interfaces


• Se pueden crear jerarquías de interfaces (con extends!!).

38

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 19
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Herencia entre Interfaces


public interface AdicionalPorEstudios {
public float POR_GRADO = 0.10f;
public float pagoAdicionalPorEstudios();
}

39

Herencia entre Interfaces


public interface AdicionalPorHijos {
public float POR_HIJO = 0.20f;
public float pagoAdicionalPorHijos();
}

40

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 20
Universidad Nacional Ingeniería de Sistemas
de Trujillo

Herencia entre Interfaces

public interface Adicionales extends AdicionalPorEstudios,


AdicionalPorHijos {
public float pagoTotalAdicionales();
}

41

Ejemplo de Herencia Múltiple


 La empresa XYZ requiere una aplicación informática para administrar los
datos de su personal.
 Del personal se conoce: número de DNI, nombre, apellidos y fecha de
ingreso.
 Existen dos categorías de personal: el personal contratado y el personal a
destajo. Los empleados contratados tienen un sueldo básico y un
porcentaje adicional en función al tiempo laborado: de 0 a 3 años: 5%; de 4
a 7 años: 10%; de 8 a 15 años: 15% y más de 15 años: 20%
 Los empleados a destajo tienen un número de clientes captados y un
monto por cliente captado.
 A ambos tipos de empleados se les aplican descuentos por faltas o
tardanzas en función del valor de un sueldo básico (S/.850).

42

Curso: Tecnología de la Programación I Tema: Herencia


Docente: Mg. Zoraida Yanet Vidal Melgarejo Pág. 21

También podría gustarte