Java 8 ha agregado un método predeterminado, que puede agregar nuevas características funcionales a la interfaz sin afectar la clase de implementación de la interfaz. Ilustramos esto con ejemplos a continuación.
La copia del código es la siguiente:
clase pública myClass implementa interfacea {
public static void main (string [] args) {
}
@Anular
public void sayssomething () {
// TODO STUB de método generado automático
}
}
interfaz interfaz interfacea {
Public void dice que algo ();
}
El código anterior muestra que la clase MyClass implementa el método SaysomThing () de la interfaz InterfacesA. Ahora agregamos un nuevo método sayhi () a la interfaz interfacesa. Si esto se hace, la clase MyClass no se puede compilar a menos que proporcionemos el método de implementación de Sayhi ().
El método predeterminado es muy útil. Por ejemplo:
La copia del código es la siguiente:
clase pública myClass implementa interfacea {
public static void main (string [] args) {
}
@Anular
public void sayssomething () {
// TODO STUB de método generado automático
}
}
interfaz interfaz interfacea {
Public void dice que algo ();
Public Public Void Sayshi () {{
System.out.println ("HI");
}
}
Tenga en cuenta que debemos proporcionar implementaciones de todos los métodos predeterminados. Por lo tanto, el método predeterminado hace que nuestro código sea más flexible y también puede escribir métodos para implementarlos en la interfaz. El método implementado se implementará como el método predeterminado.
Entonces, ¿qué debo hacer si hay un conflicto en múltiples interfaces?
Dado que las clases de Java pueden implementar múltiples interfaces, puede haber una situación en la que dos o más interfaces tienen un método de interfaz predeterminado con el mismo nombre, causando conflictos. Debido a que la máquina virtual Java se está ejecutando cuando el programa se está ejecutando, no está claro qué método predeterminado desea usar. Esto causará un error de compilación.
Echemos un vistazo al siguiente ejemplo.
La copia del código es la siguiente:
clase pública myClass implementa interfacea, interfaceB {
public static void main (string [] args) {
MyClass MC = new MyClass ();
mc.sayhi ();
}
@Anular
public void sayssomething () {
// TODO STUB de método generado automático
}
}
interfaz interfaz interfacea {
Public void dice que algo ();
Public Public Void Sayshi () {{
System.out.println ("Hi de Interfacea");
}
}
interfaz interfaz interfaceB {
Public Public Void Sayshi () {{
System.out.println ("HI desde InterfaceB");
}
}
No puede pasar la compilación e informará el siguiente error:
"Los métodos predeterminados duplicados llamados SayHi con los parámetros () y () se heredan de los tipos interfaces e interfacea".
A menos que el método sayhi () se anule en la clase myclass:
La copia del código es la siguiente:
clase pública myClass implementa interfacea, interfaceB {
public static void main (string [] args) {
MyClass MC = new MyClass ();
mc.sayhi ();
}
@Anular
public void sayssomething () {
// TODO STUB de método generado automático
}
@Anular
public void sayshi () {
System.out.println ("Implementación de Sayhi () en MyClass");
}
}
interfaz interfaz interfacea {
Public void dice que algo ();
Public Public Void Sayshi () {{
System.out.println ("Hi de Interfacea");
}
}
interfaz interfaz interfaceB {
Public Public Void Sayshi () {{
System.out.println ("HI desde InterfaceB");
}
}
Si desea especificar qué método SayHi () de la interfaz para llamar, podemos hacer esto:
La copia del código es la siguiente:
clase pública myClass implementa interfacea, interfaceB {
public static void main (string [] args) {
MyClass MC = new MyClass ();
mc.sayhi ();
}
@Anular
public void sayssomething () {
// TODO STUB de método generado automático
}
@Anular
public void sayshi () {
Interfacea.super.sayhi ();
}
}
interfaz interfaz interfacea {
Public void dice que algo ();
Public Public Void Sayshi () {{
System.out.println ("Hi de Interfacea");
}
}
interfaz interfaz interfaceB {
Public Public Void Sayshi () {{
System.out.println ("HI desde InterfaceB");
}
}
¿La respuesta es muy simple?