我们可以覆盖Java中的默认方法吗?
Java中的默认方法是在接口内部定义的带有关键字default的Java中的方法,称为默认方法。它是一种非抽象方法。
该方法能够添加向后能力,以便旧接口可以掌握 lambda 表达式能力。
Java接口默认方法也称为 Defender 方法或虚拟扩展方法。
在Java 8 之前,接口只能有抽象方法。这些类分别为这些方法提供实现。因此,如果要向接口添加新方法,则必须在实现相同接口的类中提供其实现代码。为了克服这个问题, Java 8 引入了默认方法的概念,它允许接口具有带实现的方法,而不会影响实现接口的类。
我们可以覆盖Java中的默认方法吗?
在Java中覆盖默认方法不是强制性的。
如果我们在一个程序中只使用一个接口,那么我们一次只使用一个默认方法,此时不需要覆盖,如下面的程序所示:
Java
// Creating Interface
interface GfG{
public default void display() {
System.out.println("GEEKSFORGEEKS");
}
}
// Main Class With Implementation Of Interface
public class InterfaceExample implements GfG{
public static void main(String args[]) {
InterfaceExample obj = new InterfaceExample();
// Calling Interface
obj.display();
}
}
Java
// Java program to demonstrate the case when
// two interfaces are not overridden
// Creating Interface One
interface GfG{
public default void display() {
System.out.println("GEEKSFORGEEKS");
}
}
// Creating Interface Two
interface gfg{
public default void display() {
System.out.println("geeksforgeeks");
}
}
// Interfaces are not Overidden
public class InterfaceExample implements GfG,gfg {
public static void main(String args[])
{
InterfaceExample obj = new InterfaceExample();
obj.display();
}
}
Java
// Java program to demonstrate the case
// when two interfaces are overridden
// Creating Interface One
interface GfG{
public default void display()
{
System.out.println("GEEKSFORGEEKS");
}
}
// Creating Interface Two
interface gfg{
public default void display()
{
System.out.println("geeksforgeeks");
}
}
public class InterfaceExample implements GfG,gfg {
// Interfaces are Overrided
public void display() {
GfG.super.display();
gfg.super.display();
}
public static void main(String args[]) {
InterfaceExample obj = new InterfaceExample();
obj.display();
}
}
输出
GEEKSFORGEEKS
但是当使用两个以上的接口并且都充当父类时,那么此时需要覆盖默认方法。 如果我们在两个接口中使用多个接口,如果两个接口具有相同的名称和相同的结构。所以在那个时候,必须覆盖其中一个默认方法,否则会导致错误。
案例 1:当两个接口未被覆盖时
Java
// Java program to demonstrate the case when
// two interfaces are not overridden
// Creating Interface One
interface GfG{
public default void display() {
System.out.println("GEEKSFORGEEKS");
}
}
// Creating Interface Two
interface gfg{
public default void display() {
System.out.println("geeksforgeeks");
}
}
// Interfaces are not Overidden
public class InterfaceExample implements GfG,gfg {
public static void main(String args[])
{
InterfaceExample obj = new InterfaceExample();
obj.display();
}
}
输出:
InterfaceExample.java:18: error: types GfG and gfg are incompatible;
public class InterfaceExample implements GfG,gfg {
^
class InterfaceExample inherits unrelated defaults for display() from types GfG and gfg
1 error
案例 2:当两个接口被覆盖时
Java
// Java program to demonstrate the case
// when two interfaces are overridden
// Creating Interface One
interface GfG{
public default void display()
{
System.out.println("GEEKSFORGEEKS");
}
}
// Creating Interface Two
interface gfg{
public default void display()
{
System.out.println("geeksforgeeks");
}
}
public class InterfaceExample implements GfG,gfg {
// Interfaces are Overrided
public void display() {
GfG.super.display();
gfg.super.display();
}
public static void main(String args[]) {
InterfaceExample obj = new InterfaceExample();
obj.display();
}
}
输出
GEEKSFORGEEKS
geeksforgeeks