0% encontró este documento útil (0 votos)
114 vistas42 páginas

Herencia en Programación Java

1. La herencia permite que una clase herede atributos y métodos de otra clase. 2. Esto permite reutilizar código y ampliar funcionalidad de clases existentes de forma sencilla. 3. En Java, una clase hereda de una única superclase pero puede tener múltiples subclases.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
114 vistas42 páginas

Herencia en Programación Java

1. La herencia permite que una clase herede atributos y métodos de otra clase. 2. Esto permite reutilizar código y ampliar funcionalidad de clases existentes de forma sencilla. 3. En Java, una clase hereda de una única superclase pero puede tener múltiples subclases.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd

Herencia

Introducción
 La herencia es uno de los conceptos más importantes y potentes de la POO
 Se puede definir la herencia como la capacidad de crear clases que adquieran
de forma automática los miembros( atributos y métodos) de otras clases que
ya existen pudiendo al mismo tiempo añadir atributos y métodos propios
 Entre las ventajas que ofrece la herencia en el desarrollo de aplicaciones
están.
◦ reutilización de código es decir en los casos en que necesitemos crear
una clase que además de sus métodos propios necesite 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 cuando tenemos una
clase con cierta funcionalidad y en un momento dado necesitamos
ampliarla no hace falta modificar la clase existente sino que podemos crear
una nueva clase que herede a la primera de forma que adquiera toda su
funcionalidad y añada la suya propia
Nomenclatura y reglas
Antes de ver como se crean las clases en Java usando herencia vamos a ver
algunos conceptos:
 En POO a la clase que va a ser heredada se la llama superclase ó clase base
y la clase que hereda se la llama subclase ó clase derivada
 Gráficamente la herencia entre dos clase se representa con una flecha
saliendo de la subclase hacia la superclase

superclase

subclase
Relación “es un”
La herencia entre dos clases va a establecer una relación entre las dos de tipo
“es un” lo que significa que un objeto de una subclase “es un” objeto de la
superclase. Por ejemplo:
 Vehiculo es la superclase de Coche entonces
un coche “es un” vehiculo;
 Animal es la superclase de Mamifero y esta es a su vez es superclase
de Leon por lo que
un leon “es un” mamifero y “es un” animal

Una forma de saber si una relación de herencia entre dos clase esta bien
planteada es comprobar si se cumple esa relación “es un” entre la subclase y su
superclase
1.-Herencia en JAVA
 Se basa en la existencia de relaciones de especialización/ generalización entre
clases.
 Representa relaciones del tipo “es un”.
 Las clases se organizan de manera jerárquica de forma que las clases hijas
(subclases) heredan los atributos y métodos de las clases padres (superclases)
y además pueden introducir atributos y métodos propios.
 En Java existen varias reglas básicas sobre la herencia que son
o no se permite la herencia múltiple es decir una subclase no puede heredar
de mas de una clase
o si se permite la herencia multinivel es decir A puede ser heredada por B y C
puede heredar B
o una clase puede ser heredada por varias clases
2.Tipos de herencia
 Tipos de herencia
◦ Herencia simple: una clase solo puede tener una clase padre
◦ Herencia múltiple: una clase puede tener varias clases padres. Java no
permite herencia múltiple. Esta se simula mediante la utilización de
interfaces ( se explicarán posteriormente).

Animal

Mamifero Ave

Perro Gato
3.Implementación
 La implementación de la herencia en Java se realiza utilizando la palabra
reservada: extends seguida del nombre de la superclase
 Sintaxis :
[modificador] class Clase extends OtraClase
{
//Definición de la clase
}
 A esta herencia se le denomina Herencia de implementación.
Ejemplo :
public class Perro extends Mamifero
{
//Definición de la clase
}
• La nueva clase puede incluir métodos y atributos propios para completar su
función.
Por ejemplo Perro podria incluir num_patas, el metodo ladrar etc
• Una clase puede ser a la vez subclase y superclase
• Una subclase puede redefinir métodos heredados si no son final
• Todas las clases java heredan alguna clase y en caso de que no se especifique
explícitamente la clase que se va a heredar, se hereda de de forma implícita
Object. Esta clase esta en el paquete java.lang y proporciona el soporte
básico para cualquier clase java
La declaración de una clase que no herede explícitamente a otra equivale a:
public class NombreClase extends Objects
{
//Definición de la clase
}
por lo tanto Objects es la superclase de todas las clases

• Una subclase hereda todos los miembros de la superclase incluidos los


privados pero no tiene acceso a estos últimos ya que private significa
privado a la clase es decir que solo son accesibles desde el interior de la
clase. Para poder acceder a ellos si la superclase tuviera métodos get/set
como también estos van a ser heredados por la subclase no habría
problemas pero lo mejor es usar desde la subclase los constructores de la
superclase
Superclase
Subclase hija de
Persona

Subclase hija de
Empleado
El método getNombre()
de Persona lo heredan
las subclases Empleado
y Directivo

El método getSueldo() de
Empleado es heredado por
Directivo. Sin embargo, si
intento usar este método
en Persona da un error
4.La Clase Object
 En Java todas las clases heredan por defecto de la clase Object (definida en
el paquete java.lang).
 Esto significa que todas las clases definidas van a contar con los métodos y
atributos de la clase Object
 Algunos métodos importantes son:
◦ public boolean equals(Object o): compara dos objetos y dice si son
iguales.
◦ public String toString(): devuelve un String que contiene una
representación del objeto como cadena de caracteres.
◦ public Object clone(): devuelve un objeto que es una copia del objeto
actual.
◦ public Class getClass(): devuelve un objeto de la clase predefinida Class
indicando la clase a la que pertenece el objeto.

Para conocer los demás métodos de la clase Object consultar el API de java.
5.Sobrescritura de métodos
 Las subclases puede sobrescribir (implementar) los métodos que han
heredado.
 Para sobrescribir un método hay que respetar totalmente la declaración del
método:
◦ El nombre ha de ser el mismo
◦ Los parámetros han de ser los mismos
◦ El modificador de acceso no puede ser más restrictivo (por ejemplo se
puede pasar de protected a public, pero no a private)
◦ Si el método de la superclase es estático también lo será en la subclase.
 Al ejecutar un método se busca su implementación de abajo a arriba en la
jerarquía de clases.
 Los atributos no se pueden redefinir.
La subclase Empleado va a
sobreescribir el método
toString() de la superclase
Persona. Idem Directivo
Nótese que los atributos
no tienen modificador de
acceso y son visibles
dentro del paquete, por
eso no hay problema
para acceder a ellos en
las subclases
Sobrescritura de métodos
 Las métodos de la super-clase que han sido redefinidos pueden ser todavía
accedidos por medio de la palabra super (se explica posteriormente).
 Métodos private o static -> no pueden sobrescribirse
 Métodos final -> tampoco pueden sobrescribirse
 Métodos abstract -> obligatoriamente sobrescritos
 Tener en cuenta que sobresecritura es distinto que sobrecarga.
 Los métodos de la clase Object pueden ser sobrescritos para adaptarlos
según las necesidades:
◦ Un ejemplo de método sobrescrito es equals() ó toString().
El método toString() se sobreescribe
en Empleado invocando al método
toString() de la clase padre Persona
con super.toString().
Idem en Directivo; aquí super hace
referencia a Empleado. La salida es
la misma que en el ejemplo anterior.
6.Sobrecarga
 Sobrescribir un método es un concepto distinto que sobrecargar un
método.

 La sobrecarga de un método significa tener varias implementaciones del


mismo método con parámetros distintos:
◦ El nombre ha de ser el mismo
◦ Los parámetros tienen que ser distintos
◦ El tipo de retorno puede ser distinto
◦ El modificador de acceso puede ser distinto

 Ya hemos visto ejemplos de métodos sobrecargados son los constructores:


constructor vacío sin parámetros, constructor con varios parámetros,
constructor de copia, etc.
7.super y this
Son dos palabras reservadas de Java
 super
◦ es una referencia al objeto actual pero apuntando al padre.
◦ se utiliza para acceder a atributos y métodos definidos en la clase padre
(incluyendo a los constructores).
◦ cuando el atributo o método al que se hace referencia no ha sido
sobrescrito en la subclase, el uso de super es redundante.
 this
◦ es una referencia al objeto actual.
◦ se utiliza para acceder a atributos y métodos del propio objeto.
◦ Existen dos ocasiones en las que el uso no es redundante:
 acceso a un constructor desde otro constructor
 acceso a un atributo desde un método donde hay definida una variable
local con el mismo nombre que el atributo.
8. Constructores de clases heredadas
 Los constructores no se heredan ni se sobrescriben
 El constructor de una clase que hereda de otra puede llamar al
constructor de su super-clase por medio de la palabra super(), seguida
entre paréntesis de los argumentos apropiados para uno de los
constructores de la super-clase.
◦ Ejemplo: super(3,5); // En lugar de Rectangulo(3,5)
 De esta forma, un constructor sólo tiene que inicializar directamente las
variables no heredadas.
 La llamada al constructor de la super-clase debe ser la primera
sentencia del constructor, excepto si se llama a otro constructor de la
misma clase con this().
 Si el programador no la incluye, Java incluye automáticamente una llamada al
constructor por defecto de la super-clase: super().
Constructor de
Persona

El constructor de Empleado va a
invocar al constructor de Persona con
super() pasándole los argumentos
que necesita.
Lo mismo ocurre con Directivo y
Empleado.
super() debe estar en la primera
línea.
 Esta llamada en cadena a los constructores de las super-clases, llega
hasta el origen de la jerarquía de clases, esto es al constructor de Object.
 Como ya se ha dicho, si el programador no declara un constructor por
defecto, el compilador crea uno, inicializando las variables de los tipos
primitivos a sus valores por defecto, y los Strings y demás referencias a
objetos a null. Antes, incluirá una llamada al constructor de la super-clase.
 Invocación automática implícita
◦ Se invoca al constructor de la clase padre sin argumentos
◦ Si no está definido -> error
 Invocación explícita
◦ Invocación a super (...) en la primera línea del constructor
 Invocación a otros constructores de la misma clase:
◦ this (...)
El constructor por defecto de Empleado:
Empleado() invoca al constructor por defecto
de Persona: Persona(). Si este no estuviera
definido en la superclase, daría un error.
También daría error definir este constructor
de Empleado, porque habría una invocación
implícita a super() que invoca al constructor
por defecto Persona() y este no está
definido.

Este constructor de Empleado no


daría ningún error, aunque no
estuviera definido el constructor
por defecto en Persona, porque
invoca a otro constructor sí
definido.
Uso de this en constructores
 A this se le puede utilizar para invocar a un constructor dentro de otro
constructor de la misma clase.

Constructor de Directivo que utiliza 4 parámetros e


invoca a super() que es el constructor de Empleado

Constructor de Directivo que utiliza 5 parámetros e invoca


con this() al constructor anterior de Directivo que recibe 4
Este this va a deshacer
parámetros. this() debe ser la primera sentencia.
la ambigüedad entre el
nombre del atributo y la
variable
9.Modificadores de clase (recordatorio)
◦ public
 La clase es accesible desde cualquier lugar del programa.
 Si no aparece solo puede referenciarse desde el directorio o el paquete
donde esta declarada
◦ abstract
 La clase tiene algún método abstracto ( se estudiará despues)
◦ final
 No pueden crearse subclases de esa clase
 Clases finales
◦ Definiendo una clase como final conseguimos que ninguna otra clase pueda
heredar de ella.
◦ Ejemplo:
final class Vehiculo
{ … }
class Coche extends Vehiculo // El compilador indicaría un error
{ …}
10.Modificadores de atributos
 Los atributos pueden ir precedidos en su declaración de uno o varios
modificadores
◦ Modificadores de acceso (recordatorio):
 public cuando se declara un atributo como público se está permitiendo que
desde cualquier otra clase pueda referenciarse directamente.
 private si se declara un atributo como privado no se podrá acceder
directamente a él desde otra clase distinta, si no que será necesario recurrir a
algún método que proporcione o modifique su valor.
 protected Los atributos de declarados así son accesibles directamente sólo
desde la propia clase, de las subclases de esta (herencia) y las clases que se
encuentran dentro del mismo paquete.
◦ Otros modificadores (recordatorio)
 final Un atributo definido como final una vez inicializado no puede cambiar su
valor, es decir se comporta como una constante.
 static Los atributos definidos como static son atributos cuyo valor es
compartido por todos los objetos de la clase. A las variables de este tipo se les
denomina variables de clase (posteriormente se profundiza sobre las mismas).
11.Modificadores de métodos
 Los métodos pueden ir precedidos en su declaración de uno o varios
modificadores.
◦ Modificadores de acceso (recordatorio):
 public cuando se declara un método como publico se está permitiendo
que desde cualquier otra clase pueda referenciarse directamente.
 private si se declara un método como privado no podrá ser invocado
desde ninguna otra clase ( se emplean para realizar labores auxiliares que
no es necesario ver desde fuera) .
 protected los métodos así declarados son accesibles directamente sólo
desde la propia clase, de las subclases de esta (herencia) y las clases que se
encuentran dentro del mismo paquete.
Al no tener definidos los
atributos modificador de
acceso, son visibles dentro
del paquete y, por tanto,
visibles a las clases hijas.
◦ Otros modificadores (recordatorio)
 static Los métodos definidos como static son métodos que se pueden
ejecutar sin crear un objeto de la clase. Se invocan anteponiendo el nombre de
la clase no el de instancia. No dependen de ningún objeto en particular. Se
denominan métodos de clase. (posteriormente se profundiza sobre los
mismos).
Ejemplo : s=LeerTeclado.readInteger();
 final Un método declarado como final no puede ser sobrescrito por las
subclases de la clase a la que pertenece.
 abstract Define un método abstracto ( se explica posteriormente)
Modificadores: Ejemplos
 Modificador de acceso private en los atributos:
class Persona
{
private String nombre;
private int edad;
String toString ()
{
return "Nombre: " + nombre + "\nEdad: " + edad;
}
}
class Empleado extends Persona
{
long sueldoBruto;
Directivo jefe; Error:nombre y edad son privados en Persona
String toString ()
{
return "Nombre: " + nombre + "\nEdad: " + edad + "\nSueldo: " +
sueldoBruto +"\nJefe: " +((jefe == null)? nombre:jefe.nombre);
}
}
Modificadores: Ejemplos
 Solución:
class Empleado extends Persona
{
Long sueldoBruto;
Directivo jefe;
String toString ()
{
return "Nombre: " + getNombre() + "\nEdad: " + getEdad() +
"\nSueldo: " + sueldoBruto + "\nJefe: " +
((jefe == null)? getNombre() : jefe.getNombre());
}
}
Métodos que tendrán que estar definidos en la
superclase
Modificadores: Ejemplos

 Modificador de acceso protected en atributos y métodos


class Persona
{ protected String nombre;
protected int edad;
protected String toString () { El método se declara protected
return "Nombre: " + nombre + "\nEdad: " + edad;
}
}
class Empleado extends Persona
{ Error : el método sólo puede ser protected o public
El método sobreescrito no puede ser más restrictivo
long sueldoBruto;
Directivo jefe;
private String toString () {
return super.toString () + "\nSueldo: " + sueldoBruto + "\nJefe: " +
((jefe == null)? nombre : jefe.nombre);
}
} El acceso a los atributos de la superclase desde la subclase es
correcto porque son protected y visibles para las clases hijas
12.Herencia: Clases abstractas
 Una clase abstracta es una clase en la que alguno de sus métodos esta
declarado pero no esta definido es decir va a tener un nombre, parámetros y
tipo de valor devuelto pero no tiene código. A ese tipo de métodos se les
llama métodos abstractos
 En una clase abstracta un método se define como método abstracto
cuando en el momento de declararlo no se sabe como se va a implementar y
van a ser las subclases de la clase abstracta las responsables de crear un
cuerpo para ese método usando para ello lo que se denomina sobreescritura
del método
 Por ejemplo supongamos que tengo una clase Figura, sabemos que toda figura
deberá tener un método para calcular su área pero en la clase Figura no
podemos codificar ese método ya que ese cálculo va a ser diferente
dependiendo de cada tipo de figura. Por lo tanto definiremos un método
abstracto en la clase Figura y dejaremos que cada una de las subclases
(Triangulo, Circulo etc) especifiquen el contenido de ese método
sobreescribiendolo
 Al meter el método en la superclase estaremos “obligando” a que todas las
subclases respeten el formato especificado
 Las clases abstractas se declaran anteponiendo a la palabra class la palabra
abstract por ejemplo:
public abstract class NombreClase
{
//Atributos
//Métodos
public abstract nombre_metodo (argumentos);
}
 Una clase abstract puede tener métodos normales y métodos declarados
como abstract (métodos abstractos).
13.Sobre Clases abstractas
 Si una subclase no implementa un método abstracto heredado, deberá
declararse también como abstracta .
 No se puede hacer un new (es decir no se pueden crear objetos) de una
clase abstracta pero si se pueden crear objetos de sus subclases
 Se pueden definir referencias cuyo tipo sea una clase abstracta.
 También se puede definir constructores en las clases abstractas que serán
invocadas en las clases hijas con super() pero no pueden usarse estos
constructores para crear objetos de la clase abstracta

14.Sobre Métodos abstractos


• Solo tienen declaración y no poseen cuerpo de definición (sin llaves)
• Su implementación será específica de cada subclase
• Si una clase tiene algún método abstract es obligatorio que la clase sea
abstract
• En cualquier sub-clase este método deberá ser redefinido, o bien volver a
declararlo como abstract (el método y la sub-clase)
• Así como los métodos static y los final no pueden ser redefinidos, un
método abstract no puede ser static ni final.
Figura es una clase abstracta que
define dos métodos abstractos y dos
métodos no abstractos

Las clases hijas Rectangulo y Circulo implementan los dos


métodos abstractos area() y perimetro() y heredan los otros dos
métodos no abstractos
Se pueden instanciar objetos de
las clases hijas pero no de la clase
abstracta Figura
Constructores de la clase abstracta Figura

Constructores de Circulo. Uno


de ellos invoca a super() que
es el constructor de Figura
Representacion grafica de clases abstractas
* clase/metodo abstracto
* Figura
Atributos:
color
Metodos:
getColor()
* area()

Triangulo Circulo
Atributos: Atributos:
base radio
altura
Metodos:
Metodos:
getRadio()
getBase()
area()
getAltura()
area()
Herencia: Resumen
 Permite declarar una clase general en la que se definen las características
comunes. Esta clase (base ó superclase) puede ser heredada por otras clases
más específicas (derivadas ó subclases), que van a añadir sus características
particulares.
 Las subclases incluyen todos los atributos y métodos de la superclase.

Reglas de la herencia:
• Se heredan todos los atributos y métodos, aunque sólo van a ser accesibles
los declarados public o protected. En el caso de no tener calificador de
acceso, será posible el acceso si la subclase se declara en el mismo directorio
o paquete.
• Los atributos y métodos declarados private se heredan aunque sin posibilidad
de acceso dentro de la implementación de la clase.
• Las clases con el modificador final no pueden ser extendidas (es decir no
pueden tener hijas).
• Una subclase puede redefinir un método de la superclase a efectos de
especializar ésta.
o Método sobrescrito  va a sustituir al método heredado
o Método sobrescrito  mismo nombre, parámetros y tipo devuelto
o Métodos private o static  no pueden sobrescribirse
o Métodos final  tampoco pueden sobrescribirse
o Métodos abstract  es obligatorio sobrescribirlos; pueden ser
extendidos.
 Formas de llamar a los métodos:
◦ En la misma clase o subclases (acceso protected)
 idMétodo (parámetros);
 Ejemplo: mover(x,y);
◦ En la misma clase (métodos sobrescritos de superclases)
 super.idMétodo (parámetros);
 Ejemplo: super.mover(x,y);
◦ Fuera de la clase (acceso public)
 objeto.idMétodo (parámetros);
 Ejemplo: rectangulo.mover(x,y)
◦ Fuera de la clase (métodos static)
 idClase.idMétodo (parámetros);
 Ejemplo: Mat.seno(alfa);

También podría gustarte