II.6. LA HERENCIA B. Jerarquía La herencia es el mecanismo fundamental de relación entre clases en la orientación a objetos. Relaciona las clases de manera jerárquica; una clase padre clase padre o o superclase sobre superclase sobre otras clases hijas o hijas o subclases subclases..
Imagen 4: Ejemplo de otro otro árbol de herencia herencia Los descendientes de una clase heredan todas las variables y métodos que sus ascendientes hayan especificado como heredables, heredables , además de crear los suyos propios. La característica de herencia, nos permite definir nuevas clases derivadas de otra ya eistente, que la especiali!an de al"una manera. #sí #sí lo"ramos definir una jerarquía de clases, que se puede puede mostrar mediante un árbol árbol de herencia. $n todo len"uaje orientado a objetos eiste una jerarquía, mediante la que las clases se relacionan en términos de herencia. $n %ava, el punto más alto de la jerarquía es la clase Object de de la cual derivan todas las demás clases.
C. Herencia múltiple $n la orientación a objetos, se consideran dos tipos de herencia, simple y m<iple. $n el caso de la primera, una clase sólo puede derivar de una &nica superclase. 'ara el se"undo tipo, una clase puede descender de varias superclases. $n %ava sólo se dispone de herencia simple, para una mayor sencille! del len"uaje, si bien se compensa de cierta manera la ineistencia de herencia m<iple con un concepto denominado interface, interface, que estudiaremos más adelante.
D. Declaración
'ara indicar que una clase deriva de otra, heredando sus propiedades (métodos y atributos), se usa el término extends, como en el si"uiente ejemplo* public class SubClase extends SuperClase {
// Contenido de la clase
}
'or ejemplo, creamos una clase MiPunto3D, hija de la clase ya mostrada MiPunto* class MiPunto3D extends MiPunto {
int z;
MiPunto3D( ) {
x = 0; // eredado de MiPunto
! = 0; // eredado de MiPunto
z = 0; // "ue#o atributo
}
}
La palabra clave extends se utili!a para decir que deseamos crear una subclase de la clase que es nombrada a continuación, en nuestro caso MiPunto3D es hija de MiPunto.
E. Limitaciones en la herencia +odos los campos y métodos de una clase son siempre accesibles para el códi"o de la misma clase. 'ara controlar el acceso desde otras clases, y para controlar la herencia por las subclase, los miembros (atributos y métodos) de las clases tienen tres modificadores posibles de control de acceso* •
public* Los miembros declarados public son accesibles en cualquier lu"ar en que sea accesible la clase, y son heredados por las subclases.
•
priate* Los miembros declarados priate son accesibles sólo en la propia clase.
•
protected * Los miembros declarados protected son accesibles sólo para sus subclases
'or ejemplo* class Padre { // ereda de $b%ect
// &tributos
pri#ate int nu'eroa#orito nacidoace dineroDisponible;
// M*todos
public int +et&puesta() {
return nu'eroa#orito;
}
protected int +et,dad() {
return nacidoace;
}
pri#ate int +etSaldo() {
return dineroDisponible;
}
}
class i%a extends Padre {
// De-inici.n
}
class isita {
// De-inici.n
}
$n este ejemplo, un objeto de la clase !ija, hereda los tres atributos (numero"aorito, nacido!ace y dineroDisponible ) y los tres métodos ( get#puesta$%, getEdad$% y get&aldo$% ) de la clase Padre, y podrá invocarlos. uando se llame al método getEdad$% de un objeto de la clase !ija, se devolverá el valor de la variable de instancia nacido!ace de ese objeto, y no de uno de la clase Padre. -in embar"o, un objeto de la clase !ija, no podrá invocar al método get&aldo$% de un objeto de la clase Padre, con lo que se evita que el !ijo cono!ca el estado de la cuenta corriente de un Padre. La clase 'isita, solo podrá acceder al método get#puesta$%, para averi"uar el n&mero favorito de un Padre, pero de nin"una manera podrá conocer ni su saldo, ni su edad (sería una indiscreción, no/).
F. La clase Object La clase Object es la superclase de todas las clases da %ava. +odas las clases derivan, directa o indirectamente de ella. -i al definir una nueva clase, no aparece la cláusula extends, %ava considera que dicha clase desciende directamente de Object . La clase Object aporta una serie de funciones básicas comunes a todas las clases* •
public boolean e(uals$ Object obj %* -e utili!a para comparar, en valor, dos objetos. 0evuelve true si el objeto que recibe por parámetro es i"ual, en valor, que el objeto desde el que se llama al método. -i se desean comparar
dos referencias a objeto se pueden utili!ar los operadores de comparación 11 y 21. •
public int hash)ode$%* 0evuelve un códi"o hash para ese objeto, para poder almacenarlo en una !ashtable.
•
protected Object clone$% thro*s )lone+ot&upportedException: 0evuelve una copia de ese objeto.
•
public final )lass get)lass$%* 0evuelve el objeto concreto, de tipo )lass, que representa la clase de ese objeto.
•
protected oid finali,e$% thro*s -ro*able* Reali!a acciones durante la reco"ida de basura.
'ara más información véase [Arnold y Gosling, 1997] .
II.7. OPERACIONES AVANZADAS EN LAS CLASES . !ntro"ucción La pro"ramación orientada a objetos en %ava va mucho más allá de las clases, los objetos y la herencia. %ava presenta una serie de capacidades que enriquecen el modelo de objetos que se puede representar en un pro"rama %ava. $n este capítulo entraremos en ellos. 3amos a ver cómo pro"ramar conceptos avan!ados de la herencia, polimorfismo y composición, como conceptos que se pueden pro"ramar en %ava.
B. Operaciones a#an$a"as en la herencia a.) Introducción
$n el capítulo anterior ya se han estudiado los fundamentos de la herencia en %ava. -in embar"o, el len"uaje tiene muchas más posibilidades en este aspecto, como estudiaremos a continuación. onviene recordar que estamos utili!ando el códi"o de la clase MiPunto, cuyo códi"o se puede encontrar en el apartado .II/0/ )lases 1 Objetos. de este tutorial. b.) Los !"ntos #!oba!s$ static
# veces se desea crear un método o una variable que se utili!a fuera del conteto de cualquier instancia, es decir, de una manera "lobal a un pro"rama. +odo lo que se tiene que hacer es declarar estos elementos como static/ $sta es la manera que tiene %ava de implementar funciones y variables "lobales. 'or ejemplo* static int a = 3;
static #oid 'etodolobal() {
// i'ple'entaci.n del '*todo
}
4o se puede hacer referencia a this o a super dentro de una método static. 5ediante atributos estáticos, todas las instancias de una clase además del espacio propio para variables de instancia, comparten un espacio com&n. $sto es &til para modeli!ar casos de la vida real. 6tro aspecto en el que es &til static es en la creación de métodos a los que se puede llamar directamente diciendo el nombre de la clase en la que están declarados. -e puede llamar a cualquier método static, o referirse a cualquier variable static2 utili!ando el operador punto con el nombre de la clase, sin necesidad de crear un objeto de ese tipo* class ClaseStatic {
int atrib"oStatic = 12;
static int atribStatic = ;
static #oid 'etodoStatic() {
S!ste'4out4println(5Met4 static = 5 6 atribStatic);
}
static #oid 'etodo"oStatic() {
S!ste'4out4println(5Met4 no static = 5 6 atrib"oStatic);
}
}
$l si"uiente códi"o es capa! de llamar a metodo&tatic y atrib&tatic nombrando directamente la clase (sin objeto, sin ne*), por haber sido declarados static. S!ste'4out4println(5&t4 static = 5 6 ClaseStatic4atribStatic); ClaseStatic4'etodoStatic(); // Sin instancia ne7 ClaseStatic()4'etodo"oStatic(); // ace -alta instancia
-i ejecutamos este pro"rama obtendríamos* &t4 static =
Met4 static = Met4 no static = 12
0ebe tenerse en cuenta que en un método estático tan sólo puede hacerse refernecia a variables estáticas. c.) Las c!ass % "&todos abstractos$ abstract
7ay situaciones en las que se necesita definir una clase que represente un concepto abstracto, y por lo tanto no se pueda proporcionar una implementación completa de al"unos de sus métodos. -e puede declarar que ciertos métodos han de ser sobrescritos en las subclases, utili!ando el modificador de tipo abstract/ # estos métodos también se les llamaresponsabilidad de subclase. ualquier subclase de una clase abstract debe implementar todos los métodos abstract de la superclase o bien ser declarada también como abstract/ ualquier clase que conten"a métodos declarados como abstract también se tiene que declarar como abstract , y no se podrán crear instancias de dicha clase (operador ne*). 'or <imo se pueden declarar constructores abstract o métodos abstract static. 3eamos un ejemplo de clases abstractas* abstract class clase& {
abstract #oid 'etodo&bstracto();
#oid 'etodoConcreto() {
S!ste'4out4println(5,n el 'etodo concreto de clase&5);
}
}
class clase8 extends clase& {
#oid 'etodo&bstracto(){
S!ste'4out4println(5,n el 'etodo abstracto de clase85);
}
}
La clase abstracta clase# ha implementado el método concreto metodo)oncreto$%, pero el método metodo#bstracto$% era abstracto y por eso ha tenido que ser redefinido en la clase hija clase. clase& re-erencia& = ne7 clase8(); re-erencia&4'etodo&bstracto(); re-erencia&4'etodoConcreto();
La salida de la ejecución del pro"rama es* ,n el 'etodo abstracto de clase8 ,n el 'etodo concreto de clase&