Estaba aprendiendo a través de interfaces cuando noté que ahora puede definir métodos estáticos y predeterminados en una interfaz.
public interface interfacesample2 {
public static void method() {
System.out.println("hello world");
}
public default void menthod3() {
System.out.println("default print");
}
}
Por favor, explique la diferencia de los dos y también si hay un ejemplo de cuándo usaríamos esto sería bueno. Un poco confundido sobre interfaces.
default implementation
de un método que podría anularse.Respuestas:
Diferencias entre los métodos estáticos y predeterminados en Java 8:
1) Los métodos predeterminados se pueden anular al implementar la clase, mientras que los estáticos no .
2) El método estático pertenece solo a la clase de interfaz, por lo que solo puede invocar el método estático en la clase de interfaz, no en la clase que implementa esta interfaz, consulte:
3) Tanto la clase como la interfaz pueden tener métodos estáticos con los mismos nombres, ¡y ninguno anula al otro!
fuente
purpose
( usan una implementación común ) y resuelven la ambigüedadimplementing the logic again in subclass
( anulando, ocultando ). la única razón sensata sería la razón por la que [los métodos de interfaz estática no se heredan] ( stackoverflow.com/questions/25169175/… ) y por lo tanto no podemos llamarlos usando una instancia de subclase.Un método estático es un método que se aplica a la clase 'espacio de nombres', por así decirlo. Por tanto , se accede a un
static
métodofoo
de interfaz . Tenga en cuenta que la llamada a la función no se aplica a ninguna instancia en particularInterface
Interface.foo()
de la interfaz.Por
bar
otro lado, una implementación predeterminada es llamada porUn
static
método de interfaz no puede conocer lathis
variable, pero una implementación predeterminada sí.fuente
Los métodos de interfaz estática son como métodos de clase estática (aquí pertenecen solo a la interfaz). Donde, como los métodos de interfaz predeterminados proporcionan métodos
default implementation
de interfaz (qué clases de implementación puedenoverride
)Pero recuerde que en caso de que una clase sea una
implementing more than one interface with same default
firma de método, entonces la clase de implementaciónneeds to override the default method
Puede encontrar un ejemplo simple a continuación (puede hacer bricolaje para diferentes casos)
Eso depende del planteamiento de su problema. Yo diría que los métodos predeterminados son útiles, si necesita la misma implementación para un método en su especificación en todas las clases de ese contrato, o puede usarse como
Adapter
clases.aquí hay una buena lectura: /software/233053/why-were-default-and-static-methods-added-to-interfaces-in-java-8-when-we-alread
también a continuación, el documento de Oracle explica los métodos predeterminados y estáticos para desarrollar interfaces existentes:
http://docs.oracle.com/javase/tutorial/java/IandI/nogrow.html
fuente
Aquí está mi punto de vista:
método estático en la interfaz:
Puede llamarlo directamente (InterfacetA.staticMethod ())
La subclase no podrá anularse.
La subclase puede tener un método con el mismo nombre que staticMethod
método predeterminado en la interfaz:
No puedes llamarlo directamente.
La subclase podrá anularlo
Ventaja:
Método estático: no es necesario crear una clase separada para el método de utilidad.
Método predeterminado: proporciona la funcionalidad común en el método predeterminado.
fuente
Este enlace tiene algunas ideas útiles, he enumerado algunas de ellas aquí.
Los métodos predeterminados y estáticos han reducido las diferencias entre las interfaces y las clases abstractas .
Métodos predeterminados de la interfaz :
Métodos estáticos de interfaz :
Me gustaría citar otra referencia útil .
fuente
Métodos predeterminados de la interfaz:
Ayuda a evitar las clases de utilidad, como todo el método de la clase Colecciones se puede proporcionar en las propias interfaces.
Ayuda a extender las interfaces sin tener el temor de romper las clases de implementación.
Métodos estáticos de interfaz:
Son parte de la interfaz, no podemos usarla para implementar objetos de clase.
Ayuda a proporcionar seguridad al no permitir que las clases de implementación las anulen.
Ahora como método estático que proporciona seguridad. Veamos un ejemplo.
Aquí
obj.newMethod();
, la lógica de implementación de la clase de impresión significa que podemos cambiar la lógica de ese método dentro de la clase de implementación.Pero la
obj.anotherNewMethod();
lógica de implementación de la clase de impresión, pero no la implementación de la interfaz modificada. Entonces, si hay alguna lógica de cifrado-descifrado escrita dentro de ese método, no puede cambiarla.fuente
Según Javadocs de Oracle: http://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
Normalmente, el método estático en la interfaz se usa como métodos auxiliares, mientras que el método predeterminado se usa como una implementación predeterminada para las clases que implementan esa interfaz.
Ejemplo:
fuente
Según el documento de Java14 JLS:
Método predeterminado:
Es un método de instancia declarado en una interfaz con el modificador predeterminado
Solo se puede acceder a él mediante la instancia de la clase de implementación.
Su cuerpo siempre está representado por un bloque, que proporciona una implementación o comportamiento predeterminado para cualquier clase de implementación sin anular el método.
Nunca puede ser estático o privado
Método estático:
Se puede invocar por interfaz sin hacer referencia a un objeto en particular, al igual que los métodos estáticos de clase
El método estático puede ser privado
La clase de implementación no puede acceder al método estático
Vamos a entenderlo con la ayuda del siguiente código de ejemplo:
fuente
no podemos ejecutar
Interfacesample2.menthod3();
porque no es un método estático. Para ejecutarmethod3()
necesitamos una instancia deInterfacesample2
interface.Encuentre el siguiente ejemplo práctico:
fuente
El inicio de la interfaz de Java 8 también puede tener un método estático. Al igual que el método estático de una clase, el método estático de una interfaz se puede llamar mediante el nombre de la interfaz.
Ejemplo
La diferencia entre el método de interfaz estático y el predeterminado es que el método predeterminado admite la herencia, pero el método estático no. El método predeterminado se puede anular en la interfaz heredada.
Aquí hay una buena lectura sobre el método predeterminado de la interfaz y el método estático. Método predeterminado de interfaz en Java 8
fuente
Todas las buenas respuestas aquí. Me gustaría agregar otro uso práctico de la función estática en la interfaz. La sugerencia proviene del libro - Effective Java, 3rd Edition de Joshua Bloch en el Capítulo 2: Creación y destrucción de objetos.
Los métodos de fábrica estáticos son métodos que devuelven un objeto. Trabajan como constructor. En casos específicos, el método de fábrica estática proporciona un código más legible que el constructor.
Citando del libro - Effective Java, 3rd Edition por Joshua Bloch
El autor da un ejemplo de colecciones donde se implementa dicho método de fábrica estático. Verificando el código, Josh Bloch puede verse como el primer autor de la clase Colecciones. Aunque Collections es una clase y no una interfaz. Pero el concepto aún se aplica.
Además, explica que la API no solo es más pequeña, sino que ayuda con la legibilidad del código y la facilidad de la API.
Aquí está uno de los métodos estáticos de la clase java.util.Collections:
fuente