📜  我们可以覆盖Java中的默认方法吗?

📅  最后修改于: 2022-05-13 01:55:09.458000             🧑  作者: Mango

我们可以覆盖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