Está en la página 1de 36

extends

Clases y POO en Java (Parte III)


William R. Yánez R.
Fundamentos de la Herencia
 Consiste en construir una nueva clase (Clase Derivada) a
partir de una clase existente (Clase Base).
 A la Clase Derivada se le denomina SubClase, y a la
Clase Base SuperClase.
 Una SubClase hereda el estado (variables) y
comportamiento (métodos) de su SuperClase (y de las
SuperClases de la SuperClase).
 Una SubClase solo puede tener una SuperClase Directa.
Java No Soporta la Herencia Multiple como C++, sin
embargo se puede proporcionar un comportamiento
similar a traves de las interfaces.
Fundamentos de la Herencia
 En Java todas las clases descienden directa o
indirectamente de la clase Object definida en el
paquete java.lang.

Thread Object InputStream

String OutputStream
Component
Socket
System Button Label Container

Throwable Panel Window JComponent

Applet Frame Dialog


Exception
Creando SubClases
 Se hace a traves de la plalabra reservada
extends, en la declaración de la clase:

class SubClase extends SuperClase


{
//Cuerpo de la Clase ...
}
¿Qué miembros Hereda la SubClase?
 Todos los miembros declarados public o protected
 Todos los miembros declarados sin especificador de
acceso, siempre que la subclase esté en el mismo
paquete.
 No hereda los miembros de la superclase, si la subclase
declara un miembro con el mismo nombre. En el caso de
las Variables se dice que Oculta a la variable miembro
de la SuperClase y en los métodos se denomina
Sobrescritura de Método.
 No hereda los miembros declarados private.
Ejemplo Basico
Para los ejemplos de esta float distancia(int x, int y) {
clase usaremos la clase Punto
int dx=this.x-x;
definida en la clase anterior:
int dy=this.y-y;
return
class Punto { Math.sqrt(dx*dx+dy*dy)
int x,y; }
private int color; float distancia(Punto P) {
return distancia(P.x,P.y);
Punto(int x, int y) { }

this.x=x;
void Mostrar()
this.y=y; { System.out.println(“x=”+x+”
} y=”,y);
}
Punto( Punto P) {
} //fin de la Clase Punto
this(P.x,P.y);
}
Ejemplo Básico
class Punto3D extends Punto {
int z;
}

La Clase Punto·3D hereda todos los miembros de


Punto excepto la variable miembro color (private).
Adicionalmente define un nuevo miembro z, por lo
cual Punto3D tiene 3 variables miembros: x,y
(heredadas de punto) y z.
Así mismo, Punto3D Hereda tambien los métodos
distancia() y mostrar().
Ocultar Variables Miembro
 Las variables miembro definidas en la subclase ocultan a las
variables miembro que tienen el mismo nombre en la
superclase.
 Ejemplo:
Class Super {
int Numero;
}
Class Sub extends Super {
int Numero;
}
 La variable Numero de Sub oculta a la variable Numero de Super y
cualquier referencia a Numero en Sub es al definido aca y no en la
SuperClase.
Uso de super
 Es una palabra reservada que permite a un método
de la subclase referirse a las variables ocultas y
métodos sobreescritos de la superclase.
 Ejemplos:

super.Numero //accede a la variable Numero de la


superclase
super.distancia() // acede al metodo de la superclase
super(x,y) //accede a un constructor de la superclase
Uso de super
 Ejemplo:
class Punto3D extends Punto{
int z;
Punto3D (int x, int y, int z) {
super(x,y);
this.z=z; Se llama al
constructor de
} la clase Punto
}
Uso de super
Class Super {
Int Numero=1;
}
Class Sub extends Super {
Int Numero=2; //Oculta a Numero de la SuperClase
void show() {
System.out.println(“Numero en Sub = ”+numero);
System.out.println(“Numero en Super =” +
super.Numero);
} Se llama a la
} variable Numero
de la SuperClase
Encadenamiento de Constructores
 Cuando creamos una jerarquia de clases
(supongamos una clase B que se deriva de una
clase A) los constructores se ejecutan en orden de
derivación: 1ro el de la superclase y luego el de la
subclase.
 Es decir , si no hacemos una llamada explicita al
constructor de la superclase (con super) el
compilador implicitamente inserta una linea
super() llamando al constructor por defecto de la
superclase.
Encadenamiento de Constructores
class A {
A() {
System.out.println("En el Constructor de A");
}
}

class B extends A {
B() {
// aca el compilador inserta una linea super() llamando al
constructor por defecto de la superclase de B
System.out.println("En el Constructor de B");
}
} Ver Constructores.java
Sobreescritura de Métodos
 La Capacidad para Sobrescribir un Método
permite a una clase heredar de su Superclase
aquellos comportamientos “más cercanos” y
luego complementar ó modificar el
comportamiento de la superclase.
 Es otra manera que tiene Java para implementar el
Polimorfismo: “Una Interfaz, multiples Métodos”
Sobrescritura de Métodos
 Para Sobrescribir un método de la superclase
se declara un método con el mismo Nombre,
Parametros y tipo de retorno que en la
superclase .
 Si se desea mantener la implementación del
método de la superclase y ampliar el método
para algún comportamiento especifico de la
subclase, podemos llamar al original a traves
de super.
Sobrescritura de Métodos
Class Punto3D extends Punto
{
int z; Aquí el método Mostrar
esta sobrescribiendo al
método con el mismo
void Mostrar() nombre en la super clase,
{
System.out.println(“x=”+x+”
y=”+y+ “z=”+z);
}
}
Sobrescritura de Métodos
Class Punto3D extends Punto {
Aparentemente el
int z; método distancia esta
sobrescribiendo al
float distancia(int x, int y, int z) método con el mismo
nombre en la super
{ clase, ya que tiene el
int dx=this.x-x; mismo tipo y nombre
int dy=this.y-y; pero diferente lista de
int dz=this.z-z; parametros, por lo cual
no hay sobrescritura
return
sino sobrecarga.
Math.sqrt(dx*dx+dy*dy+dz*dz);
}
}
Sobrescritura de Métodos
 Muchas clases proporcionan implementaciónes de
métodos vacías para que las subclases lo remplacen y le
den sentido de acuerdo a sus necesidades.
 Un ejemplo de esto es el método run() de la clase
Thread, el cual es el cuerpo principal de un hilo en
ejecución, de tal manera que para crear un Hilo
simplemente heredamos de Thread y proporcionamos
una implementación (sobreescribimos) al método run():
class Hilo extends Thread {
void run() {
System.out.println(“Esto es un Hilo”);
}
}
Reglas al Sobrescribir Métodos
 Para Sobrescribir un método, se debe tener presente
que el nuevo método debe tener el mismo Nombre,
Parametros y tipo de retorno que el método de la
superclase. Sino ocurre esto estamos hablando de
Sobrecarga de Métodos.
 Un método declarado como final en la superclase no se
puede sobreescribir.
 Un método declarado como static (Método de Clase)
en la superclase no se puede sobre escribir.
 Un método declarado como abstract en la superclase
debe ser sobreescrito ó la superclase debe ser declarada
como abstracta.
Selección Dinámica de Método
 La sobrescritura de método constituye la base de
uno de los conceptos mas poderosos de Java: La
Selección Dinámica de Método.
 Es el mécanismo mediante el cual una llamada a
un método sobrescrito se resuelve en tiempo de
ejecución y no en tiempo de compilación.
 Es otra de la formas que tiene Java de implementar
el polimorfismo.
Selección Dinámica de Método
 1) A una variable de referencia de la superclase se le puede
asignar una referencia a cualquier subclase derivada de dicha
superclase. (ej: Punto P=new Punto(3,5); Object O=P )
 2)Cuando una variable que referencia una superclase se le asigna
una referencia a un objeto de una subclase solo tendremos acceso
a aquellas partes del objeto definidas en la superclase. Es el tipo
de la variable y no el objeto referenciado quien determina que
miembros son accesibles.
 3) Cuando se trata de un método Sobreescrito (en la subclase) a
traves de una variable referencia de la superclase, es el objeto que
esta siendo referenciado quien determina a cual método
llamar y no la variable, por lo cual siempre tendrá preferencia el
método sobreescrito en la subclase (Polimorfismo).
Ver BusquedaDinamica.java
Uso de final
 La palabra reservada final tiene 3 usos:
1. Para declarar una Clase Final : No se puede
heredar de ella.
2. Para declarar un Método Final: No se puede
sobreescribir.
3. Para declarar una Variable Final: No se
puede modificar su valor, despues de haber
sido inicializada, actua como una constante.
Clases Finales
 Se puede declarar una clase como final para indicar
que la clase no puede tener subclases (no podemos
heredar de ella).
 Declaración:
final class MiClase {
//Cuerpo de la Clase ...
}
 Esto se hace, fundamentalmente, por dos razones :
– Diseño
– Seguridad
 La mayoria de las clases básicas de java son finales
por razones de seguridad.
Métodos Finales
 Se utliza para evitar que un método sea sobreescrito.
Esto es deseable cuando el método tiene una
implementación que no debe ser cambiada y que es
crítica para mantener al objeto en un estado
consistente.
 Declaración:
[acceso] final tipo método(){
//cuerpo del método
}
Donde tipo es el tipo del valor de retorno del método y
método es el nombre del mismo.
Variables Finales (Constantes)
 Cuando usamos la palabra clave final en la
declaración de una variable miembro, le estamos
indicando al compilador que se trata de una
constante, es decir su contenido no puede ser
cambiado durante la ejecución del programa.
 Declaración:
final tipo identificador=[ValorInicial]
 Por convención, se estila escribir los nombres de las
constantes en mayusuculas (Igual que en C).
 Si un programa intenta cambiar el valor de una
variable final, nos dará un error en tiempo de
compilación.
Variables Finales (Constantes)
 Las Variables finales pueden ser inicializadas
con cualquier expresión valida.
Ejemplo: final int x=Math.random();
 La inicialización de una variable final se
puede omitir al momento de declararla (blank
final), pero debe ser inicializada en el(los)
constructor(es) de la clase.
 Las Variables finales pueden “ocultarse” en
las subclases, al declarar una variable con el
mismo nombre.
Algunas Notas sobre final
 Al declarar una clase como final, implícitamente estamos
definiendo todos sus métodos como finales. ( ¿ Por qué?)
 Usualmente las constantes se declaran como static final, para que
haya una sola para todas las instancias de la clase.
 A veces es conveniente declarar los métodos como finales por
razones de eficiencia, ya que se evita el “overhead” de la selección
dinámica de método y el compilador puede realizar ciertas
optimizaciones.
 Se pueden declarar parámetros a un método como final. Si el tipo
del parámetro es una clase esto significa que no puede referenciar a
otro objeto, pero si puede cambiar el contenido del objeto dentro del
método. Si es un tipo simple el contenido de la variable no puede
cambiar.
Ver Finales.java
Clases Abstractas

 Una Clase Abstracta modela un concepto abstracto y no


puede ser instanciada, pero sirve como base para la
herencia (puede tener subclases).
 Por ejemplo la clase Number definida en java.lang
representa el concepto abstracto de un número.Tiene
sentido modelar números, pero no tiene sentido crear
“objetos genéricos” de números.
 La Clase Number sólo tiene sentido como superclase de
otras clases como Integer, Float, Double, Byte, Short,
Long que implementan números de tipos específicos.
Clases Abstractas
 Para declarar una clase abstracta, se utiliza la
palabra reservada abstract en la declaración de la
clase:

abstract class MiClase {


//Cuerpo del Método ...
}

 Si se intenta instanciar una clase abstracta nos


dará un error en tiempo de compilación.
Métodos Abstractos
 Un método abstracto es aquel que no tiene
implementación.
 De esta forma una clase puede definir una
interfaz común a sus subclases, proporcionando
la declaración de todos los métodos necesarios,
pero dejando los detalles de implementación a
las subclases.
 Declaración:

abstract tipo metodo([Parametros]);


Métodos Abstractos

 Una clase abstracta no necesita contener un


método abstracto. Pero todas las clases que
contengan un un método abstracto deben ser
declaradas como abstractas.
 Si una subclase no proporciona implementación
para un método abstracto de su superclase debe
ser declarada como abstracta
Clases y Métodos Abstractos
public abstract class Number extends Object
{
public byte byValue();
public abstract double doubleValue();
public abstract float floatValue();
public abstract int intValue();
public abstract long longValue();
public short shortValue();
}
Clases y Métodos Abstractos
 De acuerdo al cuerpo de la clase Number podemos
deducir lo siguiente:
1. No podemos instanciarla (abstract class) solo puede
ser usada como clase base para la herencia.
2. Le indica a todos los programadores que deseen crear
nuevas clases de tipos “Numericos especificos”
tomandola a ella como base, que deben proporcionar
obligatoriamente una implementación a los métodos:
doubleValue(), floatValue(), intValue(), longValue()
que convierten nuestro número a double, float, long e
int respectivamente.
3. No estamos obligados a proveer implementación a los
métodos shortValue(), byteValue().
Clases y Métodos Abstractos
abstract class ObjetoGrafico
{
int x,y;
void mover(int nuevaX, int nuevaY)
{
x=nuevaX;
y=nuevaY; dibujar() es un método
} abstracto,
abstracto todas las
subclases no abstractas de
ObjetoGrafico deben
abstract void dibujar(); proporcionar una
} implementación para el.
Clases y Métodos Abstractos
 Ejemplo:
class Circulo extends ObjetoGrafico {
void dibujar(){
//Cuerpo del Método
}
//Así mismo la clase Circulo puede tener otros
métodos y variables...
}

class Rectangulo extends ObjetoGrafico {


void dibujar(){
//Cuerpo del Método
}
}
Ver Abstractas.java
P.D.: Nos falta Ver:
Paquetes e Interfaces
para terminar el tema
3.

También podría gustarte