003 Herencia
003 Herencia
003 Herencia
Una subclase sólo puede tener un superclase y una superclase puede En Java la clase raíz de todas las clases es la clase Object y cuando
tener varias subclases, porque Java sólo implementa la herencia una clase no hereda explícitamente de ninguna otra, lo esta haciendo
simple. de Object.
superclase ClaseRaiz
Clase_A Clase_B
public class public class Clase_A extends public class Clase_A_A extends
ClaseRaiz{ ClaseRaiz{ Clase_A{
//datos //datos //datos FIGURA 6.2: OBJECT EN API JDK 8
//métodos //métodos //métodos
} } }
Cuando se instala JDK 8, se pueden utilizar todas las clases de la Las subclases heredan las funciones miembro (métodos) de la
jerarquía de clases JSE 8, cuya documentación se puede consultar superclase, respetando el tipo de acceso. Por tanto a un objeto
en: instanciado de una subclase se le podrán invocar las funciones de la
parte pública de su propia clase y las de de la superclase.
Las subclases heredan las variables miembro (datos) de la
superclase, respetando el tipo de acceso. Por tanto un objeto
instanciado de una subclase ocupa el espacio de un objeto de la Pieza
superclase más el espacio especifico de las variables miembro Se heredan los
+ unir()
propias. métodos
+ cortar(int)
Tubo Plancha
Acanalado Liso Todos los objetos Pieza, tienen
- calibre: float - largo: float las funcionalidades unir y cortar.
- medida: String - ancho: float + unir() + unir()
Cada tipo diferente de
- espesor: float + cortar(int) + cortar(int)
Pieza especializa esas dos
+ pintar(String) funcionalidades.
Cada tipo diferente de
Acanalado Liso pieza puede añadir otras
Un objeto Plancha es una
fucnionalidades diferentes
Pieza por tanto tiene numero,
- material: String - color: String
nombre, largo, ancho y
- esFlexible: boolean - espesor: float espesor
Un objeto Tubo Liso es una FIGURA 6.4: SE HEREDAN LOS MÉTODOS.
Pieza, por tanto tiene numero,
nombre, calibre, medida,
color y espesor
3. Sobrescribir métodos
Cuando se necesita que los objetos de las subclases tengan funcionalidades especializadas y distintas
de las heredadas, se definen esas funciones en dichas subclases. Este mecanismo se denomina
“override”, sobrescribir el funcionamiento del código heredado de los métodos de la superclase.
Para que exista “override” las funciones en la superclase y en las subclases tienen que tener
exactamente la misma forma: mismo nombre, mismo valor devuelto y misma lista de parámetros.
Herencia | TELEFÓNICA // 8
5. Clases abstractas
Si de una clase nunca se van a instanciar objetos, se denomina abstracta. Esto significa que dicha
clase define una representación (datos) y un comportamiento (métodos) comunes a las clases que
hereden de ella, los objetos serán instanciados de dichas clases, las cuales podrán especializar
las funcionalidades, sobrepasando los métodos y podrán añadir más atributos incorporando más
variables miembro.
En java las clases abstractas se implementan utilizando el En la jerarquía de clases utilizado la clase Pieza es abstracta,
modificador abstract. nunca habrá objetos que sean sólo Pieza, serán siempre objetos
instanciados de las clases Plancha o Tubo o Acanalado o Fijo. Si se
<<abstract>> Pieza califica Pieza como abstract esto implica que no se pueden crear
new Pieza( numero, nombre)
# numero: int
objetos de esta clase, pero hay que tener presente que cualquier
# nombre:String objeto de las subclases son objetos de tipo Pieza.
6. Polimorfismo
El polimorfismo se implementa cuando con un identificador de tipo superclase se referencia a un
objeto instanciado de una subclase y se invoca a una función que dicha subclase sobrepasa.
En el código siguiente:
7. La utilización de final
El modificador final tiene varias funcionalidades en Java, estas son:
• Aplicada a variables locales, de instancia o de clase, hace que • Aplicada a funciones de una superclase, implica que las subclases
no se puede modificar su valor una vez creada, son las llamadas no pueden sobrescribir dicha función. Esto es así para que
constantes. aquellas funcionalidades que no pueden cambiar en ninguna de
las clase que hereden la función final.
Ejemplos:
• Aplicada a una clase, implica que de esta clase no se puede
heredar, estas clases se suelen denominar “clase hoja” y
por contraposición la clase que esta en la parte superior de la
jerarquía se denomina “clase raíz”.
public class Ejemplo{
final public static int MAX_ELEMENTOS = 100; //
constante de clase
}
Herencia | TELEFÓNICA // 16
8. La clase Object
La clase Object es la raíz de la jerarquía
de clases del API JSE. Toda clase tiene package com.juan.piezas;
a Object como superclase. Por tanto public class PruebaObject {
todos los objetos, incluyendo los
arrays, pueden ejecutar los códigos de public static void main(String[] args) {
las funciones implementadas en esta Object objeto;
//Se puede utilizar una variable Object para referenciar cualquier tipo
clase. objeto = new Acanalado (102,”Humos”, 30.5f,”mms”,”plastico”, true);
System.out.println(“objeto es Acanalado: “+
(objeto instanceof Acanalado? “SI”:”NO”));
System.out.println(“La clase de objeto es: “+objeto.getClass());
Como todas las clases son subclases de objeto.
Object, cualquier variable de referencia a
Sólo se alcanzan
Object puede hacer referencia a un objeto funcionalidades
de cualquier clase. En la imagen siguiente de Object
se utiliza referencia Object para un objeto de
otra clase.
Los métodos que define Object y están disponibles en todos los • Método hashCode: Cuando se sobrepasa este método hay que
objetos son los que se muestran en la tabla siguiente, algunos ya garantizar en lo posible que el entero que devuelve será diferente
han sido utilizados y comentados: para dos objetos distintos. Si dos objetos son iguales tendrían
que devolver el mismo entero.
Un código generado por eclipse para estos dos métodos • Método clone: Esta definido en el ámbito protected, por tanto
es el siguiente: habrá que definirlo en la clase que sea necesario, no se puede
invocar a un objeto esta funcionalidad protegida.
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Pieza other = (Pieza) obj;
if (nombre == null) {
if (other.nombre != null)
return false;
} else if (!nombre.equals(other.nombre))
return false;
if (numero != other.numero)
return false;
return true;
}
Herencia | TELEFÓNICA // 19