Bienvenidos sean a este post, hoy hablaremos sobre las interfaces las cuales son un tipo de referencia en Java, estas son similar a una clase y una coleccion de metodos abstractos. Cuando una clase implementa una interfaz (interface) esta le permite heredar todos los metodos abstractos de la misma, junto a los metodos abstractos esta puede contener constantes, metodos predeterminados, metodos estaticos y tipos anidados, por ultimo los bloques de los metodos solo existen para los metodos estaticos y metodos predeterminados.

Escribir una interfaz es similar a escribir una clase pero una clase describe (define) los atributos (variables) y la conducta (metodos) de un objeto y la interfaz contiene solo la conducta que la clase implementa, la similitud entre la clase y la interfaz son las siguientes:

  • Una interfaz puede tener una gran cantidad de metodos
  • El archivo se escribe con el mismo nombre que la interfaz y con la extension .java
  • El codigo maquina de una interfaz aparece en un archivo .class
  • Estas aparecen en los paquetes, y el codigo maquina debe estar en la misma estructura de directorio que coinicida el nombre del paquete

Enumeremos las diferencias entre las interfaces y las clases:

  • Las interfaces no se pueden instanciar
  • Estas no contienen constructores
  • Todos los metodos son abstractos
  • Estas no pueden contener campos instanciables, estos pueden ser unicamente estaticos o finales
  • Estas no son extendidas por una clase sino implementadas por una clase
  • La interfaz puede extender varias interfaces

Para declarar una interfaz se debe utilizar la palabra interface, veamos su sintaxis:

public interface nombreInterface
{
.... Instrucciones ....
}

Estas son algunas propiedades de las interfaces:

  • Las interfaces son abstractas de forma implicita y por esto no es necesario utilizar la palabra abstract para declararlas
  • Cada metodo en una interfaz es abstracto y por esto no es necesario utilizarla tampoco
  • Los metodos en una interfaz son siempre publicos

Pasemos a ver el siguiente ejemplo para comprender un poco mejor el concepto de interfaces, para ello crearemos un archivo donde estara la interfaz y luego otro donde estara el programa, primero veamos el codigo de la interfaz:

Animal.java

interface Animal
{
        public void comer();
        public void viajar();
}

En este caso es una interfaz simple, donde tendremos dos metodos abstractos, comer() y viajar(), pasemos a la clase encargada de ejecutar nuestro programa:

Mamifero.java

public class Mamifero implements Animal
{
        public void comer()
        {
                System.out.println("Mamifero come");
        }

        public void viajar()
        {
                System.out.println("Mamifero se desplaza");
        }

        public int numeroPiernas()
        {
                return 0;
        }

        public static void main(String[] args)
        {
                Mamifero m = new Mamifero();
                m.comer();
                m.viajar();
        }
}

En esta clase implementamos la clase Animal, y en esta definiremos los dos metodos abstractos de Animal, en este caso comer() y viajar(), y tendremos un metodo propio llamado numeroPiernas() despues en el cuerpo de main() crearemos un objeto de Mamifero y llamaremos a los metodos definidos en la misma, si lo compilamos y ejecutamos veremos la siguiente salida:

tinchicus@dbn001vrt:~/programacion/java/codigo$ java Mamifero
Mamifero come
Mamifero se desplaza
tinchicus@dbn001vrt:~/programacion/java/codigo$

Para redefinir(override) metodos en una interfaz se deben seguir algunas reglas:

  • Las excepciones verificadas no deben declararse en métodos de implementación distintos a los declarados por el método de interfaz o subclases de los declarados por el método de interfaz.
  • La declaracion del metodo de la interfaz y el tipo de retorno o subtipo deben ser mantenidos en la sobreescritura del metodo
  • Una clase de implementación en sí misma puede ser abstracta y, de ser así, no es necesario implementar métodos de interfaz.

Veamos algunas reglas que se deben seguir para implementar una interfaz:

  • Una clase puede implementar mas de una interfaz por vez
  • Una clase solo puede extender una clase pero puede implementar muchas interfaces
  • Una interfaz puede extender otra interfaz tal como una clase

Como dijimos, una interfaz puede extender otra interfaz por medio de la palabra extends tal como lo hace una clase con otra clase, y tal como una clase la interfaz hija hereda los metodos de la interfaz padre. Veamos un simple ejemplo de como seria, supongamos que tenemos el siguiente archivo con esta interfaz:

Deportes.java

public interface Deportes
{
	setEquipoLocal(String nombre);
	setEquipoVisitante(String nombre);
}

Esta interfaz solo contendra estos dos metodos, ahora hagamos otra interfaz con el siguiente nombre:

Futbol.java

public interface Futbol extends Deportes
{
	public void marcadorLocal(int goles);
	public void marcadorVisitante(int goles);
	public void tiempoJuego(int mitad);
}

En este caso por ejemplo agregamos los metodos encargados de informar los marcadores del equipo local y visitante, y en que mitad del juego esta, ahora agreguemos la siguiente interfaz:

Basquet.java

public interface Basquet extends Deportes
{
	public void localMarcador(int puntos);
	public void visitanteMarcador(int puntos);
	public void indicadorCuarto(int cuarto);
	public void tiempoExtra(int te);
}

 En este caso no solamente tendremos dos metodos para los marcadores de los equipos sino a su vez necesitaremos un metodo encargado de indicar en que cuarto de juego estan y en caso de tiempo extra indique en cual.
En ambos casos recibiran los metodos llamados para ingresar los equipos locales y visitantes de cada uno de los deportes que son herederos, en este caso Futbol y Basquet pero cada deporte tiene sus tiempos y sus marcadores, en todos los casos deberemos definir todos y cada uno de los metodos en otra clase, ya sean los propios y los heredados. Tomemos uno de las dos interfaces y modifiquemos la misma de la siguiente manera:

public interface Futbol extends Deportes, Evento

Como dijimos antes a diferencia de las clases las interfaces pueden heredar mas de una interfaz como vemos en el texto anterior, nuestra interfaz Futbol no solo hereda de la clase Deportes sino tambien de la clase Evento pasemos al ultimo tema, interfaces de etiquetado.

Las interfaces de etiquetado son aquellas interfaces donde no existe ningun metodo en su cuerpo, este es su uso mas comun, una forma de definirlo es de la siguiente forma:

package java.util;
public interface EventListener
{}

Las dos razones basicas para tener una interfaz de etiquetado son:

  • Crear un padre en comun, con esta forma de trabajar podriamos crear una interfaz padre en comun para un grupo de interfaces, un ejemplo puede ser la interfaz EventListener la cual es extendida por docenas de otras interfaces en la API de Java
  • Agregar un tipo de dato a la clase, esta es la situacion que da nombre a la interfaz como etiquetado, esto es porque una clase que implementa este tipo de interfaz no necesita definir ningun metodo (debido a que no tiene ninguno) pero la clase se transformara en un tipo de interfaz por medio del polimorfismo

En resumen, hoy hemos visto que son las interfaces, como se utilizan, para que se pueden usar, como se declaran, algunos tipos y su funcionalidad, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Anuncios