======Herencia: Interfaces======
El concepto de interface lleva más lejos la idea de clase abstracta. Se conoce a las interfaces como //clases abstractas puras//, **ya que todos sus métodos son abstractos**, y tampoco permiten ser instanciadas.
Es decir, en una interface, no existe ninguna implementación de métodos, solo su declaración o definición.
Las interfaces sirven para establecer la //forma// de una clase, diseñando qué métodos deben tener, parámetros de esos métodos y valores de retorno, pero sin definir su funcionamiento.
Una interface también puede tener atributos, pero siempre serán ''static final''.
Otra de sus finalidades es permitir una herencia múltiple para una clase, ya que mediante el mecanismo de herencia simple (''extends'') solo se puede tener una superclase.
=====Declaración de interfaces =====
* Para crear una interface, usamos la palabra ''interface''.
* Para indicar que una clase emplea (implementa) una interface, usamos la palabra ''implements''.
* Una clase puede implementar varias interfaces (herencia múltiple).
* La interface puede definirse public o sin modificador de acceso/visibilidad, y tiene el mismo significado que para las clases.
* Todos los métodos que define una interface son ''public'' y ''abstract'' aunque no se indique explícitamente.
* Todas las variables que define una interface son ''public static final'' aunque no se indique explícitamente.
* **Una clase que implementa una interface está obligada a implementar todos sus métodos**.
[Modificadores] interface nombre_interface {
//cuerpo de la interface (declaración de métodos o atributos)
}
//Declaración de interface VehiculoAereo
public interface VehiculoAereo{
void despegar(float alturaBase);
void aterrizar();
}
La interface VehiculoAereo se aplica a cualquier clase que quiera ser Vehiculo Aereo. Para poder ser un vehiculo aereo está obligada a tener los métodos despegar() y aterrizar().
He creado la clase Globo que hereda de la clase Vehiculo, y quiero que implemente la interface VehiculoAereo:
public class Globo extends Vehiculo implements VehiculoAereo{
private int volumenGlobo;
private int capacidadPasajeros;
...
//Constructores, getters, setters
//Estoy obligado a implementar
@Override
void despegar(float alturaBase){
if(alturaBase > 500){
aumentarCombustible();
...
}
}
//Estoy obligado a implementar
@Override
void aterrizar(){
reducirVelocidadVertical();
...
}
//Métodos propios de la clase
void aumentarCombustible(){
//implementación método
}
void reducirVelocidadVertical(){
//implementación método
}
}
===== Variables de referencia de interfaces =====
Es posible crear variables de referencia de tipo interface, pero no puedo de ningún modo crear objetos de tipo interface: no permiten ser instanciadas.
//Interface List de Java
List lista1 = new ArrayList();
List lista2 = new Stack();
//Interface VehiculoAereo
VehiculoAereo vehiculo1 = new Globo();
VehiculoAereo vehiculo2 = new Avion();
Además permiten un polimorfismo múltiple dado que una clase puede implementar múltiples interfaces:
Cuando una clase implementa una interface, está obligada a implementar todos los métodos definidos en esa interface, y si implementa varias interfaces, ocurre lo mismo:
VehiculoAereo vehiculo1 = new Globo();
VehiculoAereo vehiculo2 = new Avion();
VehiculoConMotor vehiculo3 = new Globo();
VehiculoConMotor vehiculo4 = new Avion();
===== Herencia de interfaces =====
Una interface también permite heredar de otra interface, **solo de una**, mediante el mecanismo de la herencia simple:
public interface nombre_interface extends nombre_interface{
tipo_retorno nombre_metodo(lista_argumentos ) ;
. . .
}
----
(c) {{date> %Y}} Fernando Valdeón