domingo, 26 de mayo de 2013

Interfaces en Java

Como sabemos en Java no existe la herencia múltiple, pudiendo heredar solamente de una clase, las Interfaces son una gran herramienta para simular este concepto......

En esta entrada describiremos un poco sobre lo que son las interfaces, sus principales características y veremos un diagrama que nos puede colaborar para su mejor entendimiento...

Para empezar debemos saber que una Interface es una Clase completamente Abstracta, como regla, sabemos que las clases abstractas poseen como mínimo un método abstracto, pero hablando de una interface, todos sus métodos tienen que serlo...

Como vimos en la entrada sobre conceptos básicos, las interfaces muchas veces son definidas como un tipo de contrato entre las clases concretas que la implementen, ya que la clase que lo haga se encuentra obligada a definir los métodos abstractos que la componen. 

Lo anterior quiere decir que cuando creamos un Interface, lo que hacemos es definir lo que la clase que la implemente podrá hacer, pero no indicamos la forma en que lo hará.

Herencia Multiple?

Podemos decir que las interfaces simulan la herencia múltiple ya que una clase puede implementar cualquier numero de interfaces, además las interfaces pueden heredar uno o mas números de interfaces mediante la palabra extends, pero jamas podrán heredar clases concretas...

En java se usa la palabra reservada implements para indicar que implementamos una interface, la estructura general de una clase que implementa una interface es la siguiente.

interface InterfacePrincipal {
 
 public void metodoAbstracto();
 
 public String otroMetodoAbstracto();
 
}

public class Principal implements InterfacePrincipal,otraInterface,otraMas{

 public void metodoAbstracto() {
  /**Implementación definida por la clase concreta*/
 }

 public String otroMetodoAbstracto() {
  /**Implementación definida por la clase concreta*/
  return "retorno";
 }

 public void metodoAbstractoDeOtraInterface() {
  /**Implementación definida por la clase concreta*/
 }

 public void metodoAbstractoDeOtraMas() {
  /**Implementación definida por la clase concreta*/
 }
}
Vemos que la clase Principal implementa 3 interfaces, por eso decimos que simulan la herencia múltiple ya que heredamos los métodos que nos brindan..............veamos en general las principales características.

Características de las Interfaces.

  • Todos los métodos de una interfaz son implícitamente public abstract, no es necesario especificarlo en la declaración del mismo.
  • Todas las variables y atributos de una interfaz son implícitamente constantes (public static final), no es necesario especificarlo en la declaración del misma
  • Los métodos de una interfaz no pueden ser: static, final, strictfp ni native.
  • Una interfaz puede heredar (extends) de una o más interfaces.
  • Una interfaz no puede heredar de otro elemento que no sea una interfaz.
  • Una interfaz no puede implementar (implements) otra interfaz.
  • Una interfaz debe ser declarada con la palabra clave interface.
  • Los tipos de las interfaces pueden ser utilizados polimórficamente.
  • Una interfaz puede ser public o package (valor por defecto). 
  • Los métodos toman como ámbito el que contiene la interfaz.
 Algunas de las anteriores características se verían así.

/**Las interfaces Heredan de cualquier cantidad de interfaces usando extends*/
 public interface PrimerInterface extends SegundaInterface, TercerInterface
{
   
/**Las siguientes son declaraciones validas para los atributos*/
   int ATRIBUTO1= 5;
   public int ATRIBUTO2= 5;
   public static int ATRIBUTO3= 5;
   public final int ATRIBUTO4= 5;
   static int ATRIBUTO5= 5;
   final int ATRIBUTO6= 5;
   static final int ATRIBUTO7= 5;
   public static final int ATRIBUTO8= 5;

/**Las siguientes son declaraciones validas para los métodos*/
   void metodoPrimerInterface1();
   public void metodoPrimerInterface2();
   abstract void metodoPrimerInterface3();
   public abstract void metodoPrimerInterface4();
 }

Como vemos las anteriores son algunos ejemplos de la forma de declarar atributos o métodos, cualquiera de las opciones anteriores es valida....

Hay que tener presente algo, ya vimos que tanto para clases Abstractas como para Interfaces la herencia es permitida, pero por ejemplo para este tipo componentes, si una interface hereda de otra, esta no está obligada a implementar los métodos que posee la Interface padre, ya que la implementación tanto de los métodos de la clase padre como de la interface que los hereda depende de la clase concreta que implemente dicha interface........ este principio también aplica a las clases Abstractas, si una clase abstracta implementa una interface, los métodos de esta no necesariamente se deben implementar en la clase Abstracta, pero si se tienen que implementar en la clase concreta que herede de la clase abstracta....
 

¿Cuando Utilizarlas?

Su uso esta muy ligado al concepto de herencia y cumple el mismo principio que aplicamos al usar clases abstractas, lo que buscamos es establecer un mecanismo donde podamos compartir características comunes entre clases diferentes, además al igual que con clases abstractas nos aseguramos que los métodos y atributos solo están disponibles para las clases que las implementen...

Veamos un Ejemplo.


En el diagrama de clases vemos 6 clases concretas y 2 interfaces, las clases Humano y Animal son clases padre de "Hombre y Mujer" y "Perro y Gato" respectivamente, ahora bien, Humano y Animal son clases diferentes con un árbol de herencia marcado, pero ambas poseen características comunes que podemos usar por medio de la interface AccionesGeneral.

Podemos decir que tanto un Hombre como un Gato pueden caminar, usando para esto el método desplazarse(), donde cada clase dará el mecanismo de desplazamiento, por ejemplo el hombre lo hace en 2 piernas mientras que el gato en 4 patas (o dependiendo de la forma como lo realicen), y este mismo concepto puede aplicarse a los otros métodos enmarcados en la Interface AccionGeneral que tanto Humanos como Animales comparten.

También tenemos la interface AccionesHumano para esos métodos o características que solo son aplicables a los humanos y que tanto Hombre como Mujer pueden adoptar, así la clase Humano podrá simular la herencia múltiple al implementar las 2 interfaces mencionadas.

Y listo!!! Básicamente esta es la lógica detras de las Interfaces, Los invito a desarrollar este ejemplo en Java aplicando la estructura de interface explicada anteriormente y similar al ejemplo tratado en la entrada sobre Clases Abstractas....

En la próxima entrada trataremos el concepto de Polimorfismo el cual esta muy ligado a todo lo visto hasta el momento.....

Adicionalmente les comparto este video donde se explica nuevamente el concepto de esta entrada...


Espero que les pueda servir...

Referencias.

Revista JavaWorld
SCJP Sun Certified Programmer for Java 6



También te podría Interesar. 


¿Hay algo que quieras anexar o comentar sobre esta entrada?  no dudes en hacerlo.....y si te gustó, te invito a compartir y Suscribirte ingresando al botón "Participar en este sitio" para darte cuenta de mas entradas como esta ;)

25 comentarios:

  1. Excelente amigo Christian, muy bien explicado...

    ResponderEliminar
  2. ¡Gracias!, es un lio comprender estos conceptos, pero tu explicación va de maravilla.

    ResponderEliminar
    Respuestas
    1. Froyland Muchas gracias por el comentario, me alegra que te sirviera ;)

      Eliminar
  3. Estaría bien una mini entrada explicando que son y sus usos de "static" y "final" (sobre todo de static que es la más complicada).

    Un Saludo y buen trabajo. Sigue Así.

    ResponderEliminar
    Respuestas
    1. Hola gracias, estoy preparando algo sobre el tema, espero muy pronto poderlo publicar ;) un saludo

      Eliminar
  4. No hay nada como un artículo como este para alguien que no sabe lo que es una interface comience con la idea equivocada. Simular herencia múltiple? En serio? Luego que si es un concepto muy ligado a la herencia. Ligado en qué sentido? Porque si el autor se refiere a diseño orientado a objetos en todo caso sería a polimorfismo y no herencia. Por cierto, lo de que las interfaces son clases abstractas.. Vamos, fatal de mal también. :(

    ResponderEliminar
    Respuestas
    1. Hola, comparto tu punto de vista cuando hablas de generar ideas equivocadas, eso precisamente es lo que genera tu comentario, pues una persona que apenas empieza puede confundirse y generarle dudas..... ya que solo comentas pero no argumentas (y lo haces como anónimo)... por esa razón explicaré cada punto argumentandote basado en lo que se por experiencia y lo que se por las fuentes.... dejo varios comentarios y dejarè enlaces donde invito a profundizar.... te invito a que me contactes para hablar sobre el tema o almenos argumentes y referencies tus fuentes......

      Eliminar
    2. Digo simular la herencia multiple ya que cuando implementas una interface implementas los metodos definidos en ellas, asi como el poder usar las constante que la interface provee, adicional a esto si leiste la entrada te darás cuenta que una interface puede extender de muchas interfaces, eso mi querido amigo se puede interpretar como herencia multiple ya que puede heredar de una o mas interfaces, igual te comparto este texto del libro como programar en Java de P.J. Deitel donde puedes corroborar esta información


      "Java, a diferencia de C++, no soporta la herencia múltiple (que
      ocurre cuando una clase se deriva de más de una superclase directa). En el capítulo 10, Programación orientada
      a objetos: polimorfismo, explicaremos cómo los programadores en Java pueden usar las interfaces para obtener
      muchos de los beneficios de la herencia múltiple... pag 379"

      libro: http://www.academica.mx/sites/default/files/adjuntos/13274/Como%20programar%20en%20Java%20-%207ma%20Edicion%20-%20P.%20J.%20Deitel.pdf

      otros enlaces que pueden servirte. http://www.ehowenespanol.com/herencia-multiple-java-info_269416/

      http://javacafesv.blogspot.com/2009/03/herencia-multiple-en-java-conveniente-o.html

      Eliminar
    3. creo que con eso te respondo la segunda pregunta de que esta ligado a la herencia... sin embargo lo digo porque aunque no es herencia en si, si hay factores que son similares, como el que las interfaces heredan y uno al implementar una interface puede hacer uso de sus metodos y constantes....

      Con respecto al polimorfismo, este juega un gran papel pero ya no enfocado a heredar sino a crear instancias de diferentes tipos, sin hembargo sin el concepto claro de herencia he interfaces el polimorfismo no tendria sentido.....

      Eliminar
    4. con respecto al mencionar que una interface es una clase completamente abstracta, lo menciono teniendo en cuenta que a simple vista la estructura de una clase y una interface es muy similar, cambia solo la palabra class por interface (entre otros detalles y ojo hablo a simple vista) y por si no lo sabias una interface es completamente abstracta (creo que con java 8 algo se modifica pero el concepto general es el mismo) sus metodos son completamente abstractos, solo que no se obliga a usar la plabra reservada abstract... te dejo otro parrafo del libro que mencioné donde lo puedes consultar...

      "La declaración de una interfaz
      empieza con la palabra clave interface y sólo puede contener constantes y métodos abstract. A diferencia de
      las clases, todos los miembros de la interfaz deben ser public, y las interfaces no pueden especificar ningún detalle
      de implementación, como las declaraciones de métodos concretos y variables de instancia. Por lo tanto, todos
      los métodos que se declaran en una interfaz son public abstract de manera implícita, y todos los campos son
      implícitamente public, static y final. pag 439"

      libro: http://www.academica.mx/sites/default/files/adjuntos/13274/Como%20programar%20en%20Java%20-%207ma%20Edicion%20-%20P.%20J.%20Deitel.pdf

      Eliminar
    5. Por ultimo me gustaria conocer mas sobre tu punto de vista y tus fuentes..... un saludo y gracias por comentar ;)

      Eliminar
  5. Que buena explicación sobre todo las gráficas que son las que me hicieron entender más el concepto de las mismas, hay mucha información pero en tu información me gusto porque se me complicaba soy nuevo en java y si es complicado de momento entender este tipo de programación POO, pero yo pensaba al revés en cuando a las interfaces, yo creía que el que tenia mayor jerarquía era la clase y que al implementar una interface, este tenía que ejecutar los métodos de la clase, cuando en realidad es al revés, la clase tiene que ejecutar y heredar los métodos de la interface, bueno es bueno tener errores sobre todo cuando empieza una persona a conocer la POO pero me agrada mucho tu explicación, agregar las características que también que tiene una interface y el modo en que se tiene que ejecutar con diferentes mecanismos, como el del humano y animal, bueno espero puedas agregar otros de la POO me agrado mucho y aprendo y entendí muy bien ahora gracias

    ResponderEliminar
    Respuestas
    1. Israel me alegra que te sirviera, esa es la idea, un saludo!!!!

      Eliminar
  6. Hola Cristian, que buen articulo tienes aqui, gracias a el puedo entender un poco mas sobre las interfaces. Aunque me surgio una duda y no se si tu puedas ayudarme a resolverla.

    Soy recien egresado de la carrera de Ing. en Sistemas y estoy practicando en una empresa en la cual estamos desarrollando una aplicacion; en ella utilizamos las interfaces como DAO's y creamos una clase para cada DAO dandoles la implementacion que deben tener. Cuando queremos hacer operaciones sobre las bases de datos creamos un objeto de dicho DAO y utilizamos cualquier metodo que previamente hayamos creado en la interfaz. Mi duda es la siguiente:

    ¿Como sabe el objeto de la interfaz realizar el proceso si en ella no esta definida mas que el nombre del metodo? Espero me este dando entender y de antemano muchas gracias por leerme

    ResponderEliminar
    Respuestas
    1. Hola Edwin si lo resolviste ? tengo la misma duda ...

      Eliminar
    2. Hola que tal Mark, omiti un detalle importante al plantear mi pregunta y es que utilizamos Spring como herramienta para diseñar la capa que se encarga de comunicar estos DAO's hacia la base de datos. No se que tan familiarizado estes con ello pero puedo darte un pequeño resumen de como funciona. En Spring existe un metodo para dejar que alguien mas(en este caso Spring) se encargue de proporcionar los recursos necesarios para que nuestra aplicacion funcione adecuadamente lo que se llama como inyeccion de dependencias(DI) si tienes oportunidad de investigarlo creo que podria quedarte mas claro como funciona esto. En mi caso aislado lo que estaba sucediendo era que dejaba que Spring inyectara en mi objeto la dependencia que necesitaba para trabajar, esto es el objeto en si que es la implementacion de esa Interface y es asi como la referencia sabia la implementacion que debia utilizar.

      Espero que esto te ayude un poco
      Saludos

      Eliminar
  7. Muy buen articulo, estoy siguiendo todos tus textos y videos.

    Gracias por compartir tus conocimientos.

    ResponderEliminar
  8. Gracias, pude comprender mejor el funcionamiento.

    ResponderEliminar
  9. hola me pueden ayudar en algo porfavor

    ResponderEliminar
  10. hola me pueden ayudar en algo porfavor

    ResponderEliminar
  11. Esto de las interfaces saldría de una necesidad .mientras programaban.y luego al resultado.buscaron en libros de latín y griego definiciones para explicar lo que encontraron...voy a explicar lo que yo entiendo de esto.p rimero un escenario. Al decir interfaz estoy suponiendo.varias clases unas 5,que la van a llevar y una que va a utilizar esas 5 clases,a esta le digo te voy a pasar una clase gorgorito ,y una ves que la tengas ejecuta el método ,enciende fuego.por lo que está clase va a estar esperando que le llegue un tipo de clase con ese método,ahora bien las primeras 5 clases son todas diferentes ,una es de gasolina,la otra de papel.la otra de gas.y otra de alchool.si a todas estas le hago que implemente la interfaz común ya para empezar ya incorporan el método que me hace falta y ya de camino cogen el mismo tipo que acepta la otra como entrada.por lo que se le puede pasar.y una vez dentro ejecutar el método.y tener calefacción interior.sin tener que almacenar productos peligrosos dentro.mas o menos funciona así,lo mismo tiene otros usos.nose. ahora a esto le pongo la definición polimorfica heredada de la herencia múltiple,que se construye con la palabra tal y se implementa interfadamente.y nose de que están hablando.resumiendo iguala tipos y hace lo que se espera que tiene que hacer sino d error

    ResponderEliminar
  12. Excelente!!!!! Gracias por tus tutoriasles!!! se agradece!

    ResponderEliminar
  13. Muy bien explicado man, sigue asi

    ResponderEliminar

Eres libre de realizar cualquier comentario, desde que pueda ayudar con gusto lo atenderé, y si es un critica, bienvenida sea!!!