Composición
La composición es el agrupamiento de uno o varios objetos y valores, como atributos que conforman el valor de los distintos objetos de una clase. Normalmente los atributos contenidos se declaran con acceso privado(private) y se inicializán en el constructor de la nueva clase.
Un ejemplo puede ser la definición de una clase Claustro, donde un claustro está formado por un Catedrático, un Profesor Titular, un Alumno, un Representante de la Administración y el Rector. En la siguiente definición , se suponen declaradas las clases necesarias para dichos objetos.
La composición crea una relación «tiene». Así por ejemplo, un Automóvil tiene un número de bastidor, una matrícula, una fecha de compra, un dueño…. Todos esos elementos se presentan utilizando el mecanismo de composición sobre la clase Automóvil, de la misma forma que se ha hecho en el ejemplo anterior con la clase Claustro.
Herencia
La herencia establece una relación es-un entre clases. La herencia introduce la capacidad de extender clases, donde la clase original se denomina clase padre(o madre), clase base o super clase, y la nueva clase se denomina clase hija, derivada o subclase. Así, una clase derivada es-una clase base. Por ejemplo, Alumno es-una Persona. Esta relación se puede representar haciendo que la clase Alumno se extienda (herede) de la clase Persona.
La sintaxis de Java para la extensión de clase (herencia) es la siguiente:
class ClaseDerivada extends ClaseBase{….}
En el caso de Alumno se escribiría:
class Alumno extends persona{…}
La nueva clase Alumno, por ser extensión de Persona tiene ya todos los atributos y métodos de Persona y puede acceder a todos ellos como si estuviesen declarados en Alumno, excepto a los que se hayan definidos como privados en Persona. Adicional-mente, en la clase Alumno se pueden declarar todos los atributos y métodos necesarios que tengan un Alumno y que no estén definidos en la clase Persona.
La clase Alumno hereda de esta clase Persona por lo que, al heredar sus atributos y métodos, un alumno ya tiene nombre, apellidos y año de nacimiento y no hay que declararlos en la clase Alumno. Los atributos y métodos que se añadan a la clase Alumno, se suman a todos loa que ya posee como Persona. La declaración de la clase Alumno podría ser:
Compatibilidad de Tipos
La herencia establece una relación es-un, es decir, un Alumno es una Persona. En este sentido cualquier objeto Alumno también se puede considerar persona. Esto quiere decir que una variable de la clase Persona puede contener una referencia a un objeto de cualquier clase derivada de Persona. A esta compatibilidad se le denomina compatibilidad ascendente y es automática.
Persona P1
Alumno Alumno1 = new Alumno(«Alicia», «Moreno», 1990);
p1 = Alumno1 //conversión Ascendente
Persona p2 = new Alumno(«Blanca», «Moreno», 1994);
También se pude realizar la asignación de una variable de la clase Persona a una variable de la clase Alumno, siempre que la variable de la clase Persona guarde una referencia a un objeto Alumno o derivado de Alumno. Esta conversión hay que indicarla explícitamente. A esta compatibilidad se le denomina compatibilidad descendente y si no es correcta se lanzará una excepción ClassCastException.
Alumno otroAlumno;
otroAlumno = (Alumno) p1; //p1 era un alumno del objeto creado antes
Para comprobar si se puede realizar una conversión descendente se utiliza el operador instanceof. Se evalúa a true si el objeto es instancia de la clase o false en un caso contrarío.
if(p1 instanceof Alumno)
otroAlumno = (Alumno) p1 ; //no lanzará la excepción, ya se ha comprobado que se puede.
Ámbitos y Visibilidad
El ámbito de las clases derivadas funciona de igual forma para cualquier clase. Heredan el ámbito de la clase base, por lo que pueden usar los atributos y los métodos que tuviera la clase base excepto los calificados como privados (private).
En cuanto al modificado de acceso protegido(protected) restringe la visibilidad de forma que sólo la propia clase que los define, sus derivadas y la clase del mismo paquete pueden usarlos. Por tanto los miembros protegidos son como públicos para las clases derivadas y las clases del mismo paquete y como privados para el resto de las clases.
Sobreescritura
En una clase derivada se pude volver a escribir uno de los métodos que ya tuviese la clase base de la que hereda. A este mecanismo se denomina sobreescritura, reescritura o redefinición dependiendo de los autores. Así mismo, también se puede sobreescribir los atributos de la clase, para ello la clase derivada se puede definir:
- Un atributo con el mismo nombre que uno de la clase base.
- Un atributo con la misma signatura(nombre y parámetros de la llamada) que uno de la clase base.
Aunque los elementos de la clase(estáticos) se pueden sobreescribir, puesto que no forman parte de las instancias de la clase al utilizarlos, se accede de acuerdo a la declaración del objeto con que se llaman sin que exista ligadura dinámica con ellos, ya que no necesitan objetos para utilizarlos.
En la sobreescritura se puede ampliar el nivel de acceso, haciéndolo más público, pero no restringirlo haciéndolo más privado. En la siguiente Tabla se muestra los cambios posibles de acceso.
Es muy común que al reescribir en una clase derivada métodos de la clase base, sea necesario invocar los métodos originales de la clase base. Para ellos, se dispone de la referencia super, que permite acceder a los métodos y atributos de la clase base. Ello permite utilizar sentencias como:
super.imprime(); //llama al método imprime de la clase base.
Para impedir que un atributo o método se pueda reescribir en una clase derivada, en la clase base se le antepone el modificador final. Este modificador final permite, dependiendo del elemento al que se le aplique:
- Para una variable: se impide que se cambie su contenido(constante).
- Para un método: impide que se sobrecargue.
- Para un parámetro de un método: impide que el método cambie su valor.
- Para una clase: impide que se herede de ella.
Constructores
Polimosfismo
Herencia Forzada y Clases Abstractas
Posteriormente de publicarán ejemplos…:)




