Herramientas de usuario

Herramientas del sitio


bloque3:interfaces

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 establecer la forma de una clase, diseñando qué métodos deben tener, parámetros de los 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 una interface, usamos la palabra implements.
  • Una clase puede implementar varias interfaces.
  • 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.
  • Todas las variables que define una interface son public static final aunque no se indique.
  • 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
   void despegar(float alturaBase){ 
      if(alturaBase > 500){
         aumentarCombustible();
         ...
      }
   }
 
   //Estoy obligado a implementar
   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<String> lista1 = new ArrayList<String>();
List<String> lista2 = new Stack<String>();
 
//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 ) ;
. . .
}

© 2020 Fernando Valdeón

bloque3/interfaces.txt · Última modificación: 04/01/2019 13:13 (editor externo)