Vous êtes sur la page 1sur 32

Herencia

Java y Servicios Web I


Master en Ingeniera Matemtica

Manuel Montenegro
Dpto. Sistemas Informticos y Computacin

Desp. 467 (Mat) montenegro@fdi.ucm.es


Contenidos

Extensin mediante herencia.

Reescritura de mtodos.

Modificador de acceso protected.

Jerarqua de clases.

La clase Object.

14/Mayo/2012 4. Herencia 2
Herencia

Mecanismo de la programacin orientada a
objetos diseado para la reutilizacin y la
extensibilidad.

Permite aadir funcionalidad a una clase ya
existente.

Superclase

Subclase

14/Mayo/2012 4. Herencia 3
Ejemplo: Persona
Persona public class Persona {
private String nombre;
String nombre; private Fecha fechaNacimiento;
Fecha fechaNacimiento; private int dni;
int dni;
<<constructor>> public Persona(String nombre,
Fecha fechaNacimiento, int dni) {
String getNombre()
Fecha getFechaNacimiento() this.nombre = nombre;
int getDni() this.fechaNacimiento = fechaNacimiento;
this.dni = dni;
void imprimirDatos()
}
public void imprimirDatos() {
System.out.print("DNI: ");
System.out.println(dni);
System.out.println("NOMBRE: " + nombre);
System.out.print("FECHA DE NACIMIENTO: ");
fechaNacimiento.imprimir();
System.out.println();
}
}

14/Mayo/2012 4. Herencia 4
Ejemplo: Persona
Persona
String nombre;
Fecha fechaNacimiento;
int dni;
<<constructor>>
String getNombre()
Fecha getFechaNacimiento()
int getDni()
void imprimirDatos()

Empleado
int sueldoBase;
int getSueldo()

14/Mayo/2012 4. Herencia 5
Ejemplo: Persona
Persona public class Empleado extends Persona {
String nombre; private int sueldoBase;
Fecha fechaNacimiento;
int dni;
<<constructor>>
public int getSueldo() {
String getNombre() return sueldoBase;
Fecha getFechaNacimiento() }
int getDni() }
void imprimirDatos()

Empleado
int sueldoBase;
int getSueldo()

14/Mayo/2012 4. Herencia 6
Contenidos

Extensin mediante herencia.

Reescritura de mtodos.

Modificador de acceso protected.

Jerarqua de clases.

La clase Object.

14/Mayo/2012 4. Herencia 7
Reescritura de mtodos
Persona public class Empleado extends Persona {
String nombre;
Fecha fechaNacimiento; public void imprimirDatos() {
int dni; System.out.print("DNI: ");
System.out.println(dni);
<<constructor>> System.out.println("NOMBRE: " + nombre);
String getNombre() System.out.print("FECHA DE NACIMIENTO: ");
Fecha getFechaNacimiento() fechaNacimiento.imprimir();
int getDni() System.out.println();
void imprimirDatos() System.out.print(SUELDO: );
System.out.println(sueldoBase);
}
}

Empleado
int sueldoBase;
int getSueldo()
void imprimirDatos()

14/Mayo/2012 4. Herencia 8
Reescritura de mtodos
Persona public class Empleado extends Persona {
String nombre;
Fecha fechaNacimiento; public void imprimirDatos() {
int dni; super.imprimirDatos();
System.out.print(SUELDO: );
<<constructor>> System.out.println(sueldoBase);
String getNombre() }
Fecha getFechaNacimiento() }
int getDni()
void imprimirDatos()

Empleado
int sueldoBase;
int getSueldo()
void imprimirDatos()

14/Mayo/2012 4. Herencia 9
Reescritura de mtodos
Persona public class Empleado extends Persona {

String nombre; public Empleado(String nombre, Fecha fechaNacimiento,


Fecha fechaNacimiento; int dni, int sueldoBase) {
int dni; this.nombre = nombre;
<<constructor>> this.fechaNacimiento = fechaNacimiento;
this.dni = dni;
String getNombre() this.sueldoBase = sueldoBase;
Fecha getFechaNacimiento() }
int getDni()
void imprimirDatos() }

Empleado
int sueldoBase;
<<constructor>>
int getSueldo()
void imprimirDatos()

14/Mayo/2012 4. Herencia 10
Reescritura de mtodos
Persona public class Empleado extends Persona {

String nombre; public Empleado(String nombre, Fecha fechaNacimiento,


Fecha fechaNacimiento; int dni, int sueldoBase) {
int dni; super(nombre, fechaNacimiento, dni);
this.sueldoBase = sueldoBase;
<<constructor>>
}
String getNombre()
Fecha getFechaNacimiento()
int getDni() }
void imprimirDatos()


La primera lnea del constructor de la
subclase ha de llamar al constructor
Empleado
de la superclase.
int sueldoBase;
<<constructor>>

Si no lo hace, se intentar llamar
int getSueldo() automticamente al constructor por
void imprimirDatos()
defecto.

14/Mayo/2012 4. Herencia 11
Contenidos

Extensin mediante herencia.

Reescritura de mtodos.

Modificador de acceso protected.

Jerarqua de clases.

La clase Object.

14/Mayo/2012 4. Herencia 12
Modificadores de acceso

Qu elementos de la superclase son accesibles
desde la subclase?

Los mtodos y atributos public son accesibles.

Los mtodos y atributos private no son accesibles,
aunque s se heredan.

Si queremos que un atributo o mtodo privado
sea accesible desde las subclases, tendremos
que definirlo en la superclase con el
modificador protected.
public class Empleado extends Persona {
protected int sueldoBase;
}
14/Mayo/2012 4. Herencia 13
Modificadores de acceso

public protected private


Dentro de la
clase

Subclases

Otro sitio

14/Mayo/2012 4. Herencia 14
Ejemplo: Estudiante
Persona public class Estudiante extends Persona {
private int puntuacionTotal;
String nombre; private int numeroCalificaciones;
Fecha fechaNacimiento;
public Empleado(String nombre, Fecha fechaNacimiento,
int dni; int dni) {
<<constructor>> super(nombre, fechaNacimiento, dni);
String getNombre() this.sueldoBase = sueldoBase;
this.puntos = 0;
Fecha getFechaNacimiento() this.numeroCalificaciones = 0;
int getDni()
}
void imprimirDatos()
public void nuevaCalificacion(int puntos) {
puntuacionTotal += puntos;
numeroCalificaciones++;
}
Estudiante public double getNotaMedia() {
return ((double) puntos)/numeroCalificaciones;
int puntuacionTotal; }
int numeroCalificaciones
public void imprimirDatos() {
<<constructor>> super.imprimirDatos();
void nuevaCalificacion(int) System.out.println(NOTA MEDIA: );
System.out.println(getNotaMedia());
double getNotaMedia() }
void imprimirDatos() }

14/Mayo/2012 4. Herencia 15
Contenidos

Extensin mediante herencia.

Reescritura de mtodos.

Modificador de acceso protected.

Jerarqua de clases.

La clase Object.

14/Mayo/2012 4. Herencia 16
Jerarqua de clases

Persona

Estudiante Empleado


Conceptualmente, la relacin entre las
superclases y las subclases es de tipo es-un.

Representan concreciones sobre el concepto
de Persona.

14/Mayo/2012 4. Herencia 17
Jerarqua de clases

Persona

Estudiante Empleado

EmpleadoComision


La jerarqua puede extenderse a varios niveles.

No se permite herencia mltiple: una clase
slo tiene una superclase.

14/Mayo/2012 4. Herencia 18
Ejemplo: EmpleadoComision
public class EmpleadoComision extends Empleado
{
private double porcentajeComision;
private int dineroVentas;

public EmpleadoComision(String nombre, Fecha fechaNacimiento, int dni,


int sueldoBase, double porcentajeComision) {
super(nombre, fechaNacimiento, dni, sueldoBase);
this.porcentajeComision = porcentajeComision;
this.dineroVentas = 0;
}

public void vender(int dineroVenta) { this.dineroVentas += dineroVenta; }

public int getSueldo() {


return sueldoBase + (int) (dineroVentas * porcentajeComision / 100.0);
}
Acceso a atributo protected
}

14/Mayo/2012 4. Herencia 19
Ejemplo: EmpleadoComision
public class TestEmpleadoComision {
public static void main(String[] args) {
EmpleadoComision ec = new EmpleadoComision(Fuckencio Martinez,
new Fecha(15, 3, 1979),
123456, 1000, 20);
ec.vender(200);
System.out.print(Sueldo: %d\n, ec.getSueldo());

1040
ec.imprimirDatos();
}
}


Discusin: qu sueldo muestra el mtodo
imprimirDatos?

14/Mayo/2012 4. Herencia 20
Figuras geomtricas
Rectangulo public class Cuadrado {
Punto origen; public Cuadrado(Punto posicion, int ancho) {
int ancho; super(posicion, ancho, ancho);
int alto;
}
<<constructor>> }
Punto getOrigen()
int getAncho()
int getAlto()
double area()
double perimetro()
void dibujar(Ventana v)

Cuadrado
<<constructor>>

14/Mayo/2012 4. Herencia 21
Figuras geomtricas
Rectangulo
Punto origen;
int ancho;
int alto;
<<constructor>>
Punto getOrigen()
int getAncho()
int getAlto()
double area()
double perimetro()
void dibujar(Ventana v)

Cuadrado RectanguloColor
<<constructor>> Color colorBorde;
<<constructor>>
Color getColorBorde()
void dibujar(Ventana v)

14/Mayo/2012 4. Herencia 22
Figuras geomtricas
RectanguloColor
Color colorBorde;
<<constructor>>
Color getColorBorde()
void dibujar(Ventana v)

RectanguloRelleno
Color colorRelleno;
<<constructor>>
Color getColorRelleno()
void dibujar(Ventana v)

14/Mayo/2012 4. Herencia 23
Contenidos

Extensin mediante herencia.

Reescritura de mtodos.

Modificador de acceso protected.

Jerarqua de clases.

La clase Object.

14/Mayo/2012 4. Herencia 24
La clase Object

Definida en el paquete java.lang

Siempre se importa por defecto.

Es la raz de toda jerarqua de clases.

Si una clase no hereda de ninguna otra
mediante extends, automticamente hereda
de Object.

Consecuencia: toda clase hereda, directa o
indirectamente, de Object.

14/Mayo/2012 4. Herencia 25
La clase Object

No tiene ningn atributo pblico ni protegido.

Define 11 mtodos, que pueden ser
sobreescritos en las subclases.
http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html


Nosotros veremos:

toString()

finalize()

equals()

14/Mayo/2012 4. Herencia 26
Mtodo toString

Obtiene una representacin del objeto en
forma de cadena de caracteres (String)
public String toString()


Los mtodos print/println/printf llaman a este
mtodo cuando reciben un objeto como
parmetro.
Fecha f = new Fecha(14, 5, 2012);
System.out.println(f)

14/Mayo/2012 4. Herencia 27
Mtodo toString
// Fecha.java
public String toString() {
String cadenaMes;
switch(mes) {
case 1: cadenaMes = "Enero"; break;
case 2: cadenaMes = "Febrero"; break;
case 3: cadenaMes = "Marzo"; break;
case 4: cadenaMes = "Abril"; break;
case 5: cadenaMes = "Mayo"; break;
case 6: cadenaMes = "Junio"; break;
case 7: cadenaMes = "Julio"; break;
case 8: cadenaMes = "Agosto"; break;
case 9: cadenaMes = "Septiembre"; break;
case 10: cadenaMes = "Octubre"; break;
case 11: cadenaMes = "Noviembre"; break;
case 12: cadenaMes = "Diciembre"; break;
default: cadenaMes = "<<mes desconocido>>"; break;
}
return String.valueOf(dia) + " de " + cadenaMes
+ " de " + String.valueOf(ao);
}

14/Mayo/2012 4. Herencia 28
Mtodo finalize

Se ejecuta cuando el objeto va a ser eliminado
de la memoria.

Un objeto es eliminado automticamente por
el recolector de basura de la mquina virtual
de Java cuando no hay ninguna referencia que
apunte hacia l.

No se especifica el momento exacto en el que esto
sucede.

finalize se utiliza para liberar los recursos
asociados al objeto.

14/Mayo/2012 4. Herencia 29
Mtodo equals

Se utiliza para comprobar si dos objetos son
iguales.
public boolean equals(Object o)


Por defecto slo devuelve true si los dos
objetos apuntan a la misma referencia.

Si se quiere implementar otra nocin de
igualdad entre objetos, se deber reescribir el
mtodo.

14/Mayo/2012 4. Herencia 30
Mtodo equals

// Fecha.java
public boolean equals(Object o) {
if (o instanceof Fecha) {
Fecha f = (Fecha) o; Conversin
return (this.dia == f.dia)
&& (this.mes == f.mes)
&& (this.ao == f.ao);
} else {
return false;
}
}

14/Mayo/2012 4. Herencia 31
Referencias

P. Deitel, H. Deitel
Java. How to Program (9th Edition)
Cap. 9.

B. Eckel
Thinking in Java (3rd Edition)
Caps. 6.

14/Mayo/2012 4. Herencia 32

Vous aimerez peut-être aussi