Sei sulla pagina 1di 22

Herencia en Java

Que es la herencia?
La herencia es una caracterstica de algunos lenguajes de programacin orientados a objetos, que permite crear objetos a base de otros ya existentes. Como ya hemos comentado en clases, la Orientacin a objetos permite la reutilizacin de cdigo. Llamaremos superclase, a la clase de la cual heredamos, y en el caso de Java, solo podremos heredar de una sola clase. La clase de la cual heredamos, nos aporta todas las funciones y mtodos que esta posee, dejando as ms fcil su implementacin.

Concepto y justificacin de la herencia


Todo objeto de una subclase es un objeto de la superclase de la cual deriva.

Herencia en Java
Herencia simple Object es la clase raz (paquete java.lang) Object describe las propiedades comunes a todos los objetos

Object
A B

Terminologa: - C y D son subclases de B - B es la superclase de C y D

D
4

Tipos de herencia
Herencia simple Una clase puede heredar de una nica clase. Ejemplo: Java, C#

Herencia mltiple Una clase puede heredar de varias clases. Clases forman un grafo dirigido acclico. Ejemplos: Eiffel, C++

Herencia en Java
Java permite definir una clase como subclase de una clase padre.
class clase_hija extends clase_padre { .......... }
Clase Padre

Clase Hija

Herencia en Java
Una subclase hereda de su superclase mtodos y variables tanto de clase como de instancia. Una subclase puede aadir nuevos mtodos y variables. Una subclase puede redefinir mtodos heredados. Sintaxis: class nombreHija extends nombrePadre {} Por defecto toda clase extiende la clase Object

class Contador {} class Contador extends Object {}

Concepto y justificacin de la herencia


Las subclases pueden redefinir los mtodos y atributos de la clase padre y aadir otros nuevos.

JERARQUIA DE CLASES

GENERALIZACION

ESPECIALIZACION

Se detectan clases con un comportamiento comn. Ejemplo: Triangulo y polgono son figuras.

No hay receta mgica para crear buenas jerarquas

Se detecta que una clase es un caso especial de otra Ejemplo: Triangulo es un tipo de Polgono.

La sintaxis que indica la herencia en JAVA


Clase persona
public class Persona { String nombre = ""; int edad;

public Persona(String nom, int ed) { nombre = nom; edad = ed; } public void mostrar() { System.out.println("Nombre: "+ nombre); System.out.println("Edad: "+ edad); } public static void main(String args[]) { Persona yo= new Persona("Balta", 99); yo.mostrar(); } }

La sintaxis que indica la herencia en JAVA


Clase trabajador
public class Trabajador extends Persona { float sueldoHora; int numHoras; public Trabajador(String nom, int ed, float suel, int num) { super(nom, ed); // llamada al constructor de Persona sueldoHora = suel; numHoras = num;} public double sueldo() { return sueldoHora * numHoras; } Trabajador yo= new Trabajador("Balta", 99, 200.5f, 45); yo.mostrar(); // se invoca al mtodo heredado mostrar double pelas = yo.sueldo(); System.out.println("Cobra: " + pelas); } }

Acceso protegido
Una subclase no puede acceder a los campos privados de la superclase Para permitir que un mtodo de la subclase pueda acceder a un campo de la superclase, ste tiene que declararse como protected Protected: miembros visibles a las subclases y al resto de clases del paquete Resumen de modificadores de acceso: private visible slo en la clase public visible a todas las clases protected visible en el paquete y las subclases Sin modificador visible en el paquete
12

Herencia y Reglas de Acceso


class Vuelo { char nombre[30]; // private (por defecto) int capacidad; // private (por defecto) private: float peso; // private protected: void carga(&operacion}; // protected public: void despegue(&operacion}; // public void crucero(&operacion); // public char* getName(); // obtener el nombre del vuelo };

Evitando la herencia
Se puede evitar que una clase sea heredada:

public final class Clase

Paquetes
Los paquetes son contenedores de clases que permite delimitar el espacio en el cual una clase existe. Los paquetes permiten que exista ms de una clase con el mismo nombre. Para indicar que una clase pertenece a un cierto paquete, se utiliza la palabra clave package La forma de esta sentencia es:
package nombrePaquete;

Conversin de tipos
Java es un lenguaje fuertemente tipado, es decir, en tiempo de compilacin se comprueba la compatibilidad de tipos

Conversin implcita: (automtica) tipos primitivos a uno que soporte un rango mayor de valores float saldo = 300; //podemos asignarle un entero int codigo = 3.7; //ERROR
conversin de referencias: todo objeto es compatible con sus superclases cast-up siempre vlido Rectangulo

Rectangulo r; Cuadrado c = new Cuadrado(); r = c;

Cuadrado
16

Conversin de tipos
Conversin explcita: tipos primitivos perdiendo informacin long l = 200; int i = (int)l; conversin de referencias asignar a un objeto de una subclase uno de la superclase cast-down o narrowing No siempre vlido El error se puede producir: en tiempo de ejecucin (ClassCastException) en tiempo de compilacin si no es ni siquiera una subclase.
17

Conversin explcita de referencias


Puede dar un error en ejecucin: Figura [] figuras = new Figura [30]; Rectangulo r = (Rectangulo)figuras[i];
Comprobar el tipo antes de la conversin: if (figuras[i] instanceof Rectangulo) r = (Rectangulo)figuras[i] Dara error en compilacin: Cuenta c = (Cuenta)figuras[i];
18

Jerarquas de herencia

Constructores y Herencia
Cuando se declara un obj de una clase derivada, se ejecutan los conts siguiendo el orden de derivacin, es decir, primero el de la clase base, y despus los conts de las clases derivadas de arriba a abajo. Para pasar parmetros al constructor de la clase padre:
super (para1, para2, ..., paraN)
20

Ejemplo de super
class Persona { private String nombre; private int edad; public Persona() {} public Persona (String n, int e) { nombre = n; edad = e; } } class Alumno extends Persona { private int curso; private String nivelAcademico; public Alumno (String n, int e, int c, String nivel) { super(n, e); curso = c; nivel_academico = nivel; } public static void main(String[] args) { Alumno a = new Alumno("Pepe", 1, 2, "bueno"); } }
21

Redefinir f. miembros de la clase padre


class Persona { private String nombre; private int edad; ................... public String toString() { return nombre + edad; } public void setEdad(int e) { edad = e; } } class Alumno extends Persona { private int curso; private String nivelAcademico; ................... public String toString() { return super.toString() + curso + nivelAcademico; } public void setCurso(int c) { curso = c; } }
22

Potrebbero piacerti anche