Abstracción y Herencia en Programación Orientada a Objetos
Resumen
Las Interfaces nos permiten usar métodos abstractos y campos constantes para implementar herencia/polimorfismo de forma muy similar a las clases abstractas.
A partir de Java 8 podemos tener implementación en métodos para heredar y reutilizar diferentes comportamientos. No todos los métodos de nuestras interfaces deben ser abstractos, ahora podemos usar el modificador de acceso default y desde Java 9 también private.
Recuerda que el nivel de acceso de default y private son los mismos que estudiamos en clases anteriores.
publicinterfaceMyInterface{// Métodos default: nos permite heredar la definición// de la función y también su implementación...defaultvoiddefaultMethod(){privateMethod("Hello from the default method!");}// Métodos private: nos permiten definir comportamiento,// pero solo se puede usar desde otras clases de esta// interfaz, no se hereda a la clase hija....privatevoidprivateMethod(final String message){System.out.println(message);}// Métodos abstractos: recuerda que todos los métodos// son abstractos por defecto...voidnormalMethod();}
Con este cambio, la interfaz y la clase abstracta parecen ser practicamente lo mismo. Sin embargo, la interfaz sigue siendo una abstracción completa (diseñada para que se implementen todos los métodos). La posibilidad de crear métodos default parace obedecer únicamente a facilitar la actualización de las interfaces sin que esto rompa las clases que ya la implementaban con anterioridad.
Muy buena aclaración.
Parecen ser prácticamente lo mismo, pero la diferencia más grande es que las interfaces podemos implementar todas las que queramos en cambio una clase padre o abstracta solo se puede extender una sola vez
Les comparto mis notas de esta Clase:
Interfaces en Java 8 y 9
La sintaxis de las interfaces cambio un poco a partir de Java 8 y 9.
Java 8
Ya no todos los métodos tiene que ser abstractos pues se cuenta con un nuevo modificador de acceso para los métodos, default. Esto permite que los métodos dentro de una interfaz puedan tener implementación, y a su vez dicha implementación se puede reutilizar en cualquier Clase sin importar a que familia pertenezca. Este modificador default en las interfaces tiene las mismas reglas y restricciones que en en caso de los métodos convencionales, es decir puede ser accedido a nivel de la Clase y por Clases/Interfaces que estén dentro de otro paquete.
Java 9
Se puede añadir el modificador de acceso private a los métodos de una Interfaz. Este modificador tiene las mismas restricciones que en el caso de los métodos convencionales, es decir, sólo puede ser accedido a nivel de la Clase. También permite hacer una implementación en el método de una Interfaz.
publicinterfaceMyInterface{defaultvoiddefaultMethod(){privateMethod("Hello from the default method!")}privatevoidprivateMethod(finalString string){System.out.println(string);}voidnormalMethod();}
Este tipo de interfaces son muy útiles al trabajar con bases de datos.
Gracias por esas excelentes notas.
Gracias por el aporte.
☕ De Java 8 para adelante podemos usar el modificador de acceso default en nuestras interfaces, pero desde Java 9 también private.
Aquí les dejo un video que explica de manera sencilla como implementar métodos "default" de una interfaz.
Espero les sirva.
https://youtu.be/Ixn8Ypri90w
graaacias
Gracias/
ejale :) a modularizar se a dicho :)
Excelente aporte!!
¿Qué sentido tiene un método private de una interfaz si el concepto básico de una interfaz es permitir el uso de un componente y por ende es pública?
Una interface solía tener sólo abstract methods a ser implementados en las clases que lo usaran.
En Java 8 se agregaron default methods para tener métodos con implementación sin afectar a las clases que implementarán esta interface y ahora con Javas 9 ya puedes usar private methods que sólo pueden ser usados por estos default methods para compartir y reutilizar código.
Es decir ahora que ya tenemos métodos con implementación en las interfaces, podemos tener métodos privados que sólo sean accesibles dentro de la misma interface.
El tener un método con modificador de acceso private en una interfaz nos ayuda a tener lógica que se repetiría en una clase que implemente de una interfaz, por lo cual los métodos con implementación y de este tipo de accesibilidad serían invocados en métodos con modificadores de acceso default y así ahorramos mucho código :D
Muchas gracias por explicar cómo afectan los modificadores de acceso a las interfaces, cuando vayamos a utilizarlos en operaciones con las bases de datos se podrá apreciar esta característica.
🤯 Esto abre un mundo de posibilidades a la hora de modularizar y estandarizar el código.
A que se refiere con implementacion???
Una implementación es la ejecución o puesta en marcha de una idea programada, ya sea, de una aplicación informática, un plan, modelo científico, diseño específico, estándar, algoritmo. Es hacer uso de él.
En términos prácticos es la versión compilada que ya se piensa usar en nuestro negocio, app, programa o algoritmo.
Gracias, excelente contendió. Como siempre
¿No podemos implementar métodos public o protected porque sino ya no se cumpliría la función de interfaz verdad?
De lo que se indica, con las nuevas mejoras de java 8 y 9 que le dan mas funcionalidad a las interfaces permitiendo implementar metodos; me surge la duda de porque ni permitir a las clases la herencia multiple... Al final es lo que se esta emulando con las interfaces... o no?
Es complicado por que la herencia múltiple puede dar paso errores en implementación de métodos ya que si una clase hereda de dos padres y por casualidad ambos padres poseen métodos con el mismo nombre pero diferente implementación la subclase no sabrá cual de los dos métodos adoptar, por el contrario si usamos el mismo caso siendo una interfaz y una superclase la subclase deberá generar su propia implementación del método esto debido a que como bien se sabe todos los métodos de las interfaces deben ser implementados en las clases que las implementen.
En que curso se ve la parte de estar generando la fuente de datos y la manipulacion?
Lo nombra aqui pero a diferencia de siempre que hacen mencion a otros cursos no dice en cual
Hice unas pruebas con las interfaces y note que en mi caso no me deja crear un metodo private en una interfaz, estoy usando Java 8 ¿Esto es de Java 9?
Así es, esto es una característica agregada en Java 9.
Y lo ideal es hacerlo en la implementacion del metodo
Yo lo vi mucho cuando se implementaban los métodos en las interfaces repository
No sé si entendí mal, pero hasta donde yo entiendo, la palabra "default" en los métodos por defecto de una interfaz de java 8 en adelante no tiene nada que ver con el nivel de acceso, es simplemente una forma de diferenciarlos de los métodos abstractos (que dentro de una interfaz no tienen ninguna palabra clave que los identifique).
Puedes tener métodos por defecto públicos, y a partir de java 9 también puedes tener métodos por defecto privados, pero no hay manera de tener métodos por defecto con el nivel de acceso "default" ni "protected".
Métodos Privados (private methods):
A veces, cuando creamos una interfaz, hay partes de código que se repiten en varios métodos. Queremos escribir este código una vez y usarlo en varios lugares, pero no queremos que otras clases lo vean.
Los métodos privados en una interfaz son como bloques de construcción ocultos. Puedes usarlos dentro de los métodos por defecto para evitar repetir código, pero otros no pueden verlos ni usarlos.
Métodos por Defecto (default methods):
Piensa en una interfaz como un contrato que las clases deben seguir. A veces, queremos añadir una nueva función a ese contrato sin afectar a las clases que ya lo siguen.
Un método por defecto es como una función en la interfaz que viene con una implementación. Las clases que siguen la interfaz pueden usar esta función si quieren, pero no están obligadas.
Ayuda a agregar nuevas funcionalidades sin obligar a todas las clases a implementar esa función.
Hay que tener en cuenta que hay distintas formas de abstraer el código, con las clases abstractas o también con las interfaces