当前位置: 首页 > 编程笔记 >

Java8中的default方法详解

尉迟景福
2023-03-14
本文向大家介绍Java8中的default方法详解,包括了Java8中的default方法详解的使用技巧和注意事项,需要的朋友参考一下

Java 8新增了default方法,它可以在接口添加功能特性,而且还不影响接口的实现类。下面我们通过例子来说明这一点。


public class MyClass implements InterfaceA {

 public static void main(String[] args){

 }

 

 @Override

 public void saySomething() {

  // TODO Auto-generated method stub

 }

}

interface InterfaceA{  public void saySomething(); }

上面的代码显示了MyClass类实现了InterfacesA接口的saySomething()方法。现在我们为InterfacesA接口新增一个sayHi()方法。这么做的话,MyClass类是无法通过编译的,除非我们提供了sayHi()的实现方法。

Default方法是非常有用的,通过在接口定义的方法的访问修饰符前加上关键字default,那么实现类就无需提供该方法的实现了。比如:


public class MyClass implements InterfaceA {

 public static void main(String[] args){

 }

 

 @Override

 public void saySomething() {

  // TODO Auto-generated method stub

 }

}

interface InterfaceA{  public void saySomething();  default public void sayHi(){   System.out.println("Hi");  } }

要注意,我们必须提供所有的default方法的实现。因此,default方法使我们的代码更加灵活,在接口中也可以写方法实现了。实现的方法会作为默认的方法实现。
那么,多接口存在冲突该怎么办?

由于Java类可以实现多个接口,那么就可能存在这样的情况:两个或多个接口都有一个同名的default接口方法,从而造成冲突。因为Java虚拟机在程序运行时,并不清楚你要使用哪一个default方法。这会导致编译错误。

让我们来看看下面的例子。


public class MyClass implements InterfaceA, InterfaceB {

 public static void main(String[] args){

  MyClass mc = new MyClass();

  mc.sayHi();

 }

 

 @Override

 public void saySomething() {

  // TODO Auto-generated method stub

 }

}

interface InterfaceA{  public void saySomething();  default public void sayHi(){   System.out.println("Hi from InterfaceA");  } }

interface InterfaceB{  default public void sayHi(){   System.out.println("Hi from InterfaceB");  } }

它是通不过编译的,会报以下错误:
“Duplicate default methods named sayHi with the parameters () and () are inherited from the types InterfaceB and InterfaceA.”
除非在MyClass类中重写了sayHi()方法:


public class MyClass implements InterfaceA, InterfaceB {

 public static void main(String[] args){

  MyClass mc = new MyClass();

  mc.sayHi();

 }

 

 @Override

 public void saySomething() {

  // TODO Auto-generated method stub

 }

 

 @Override

 public void sayHi(){

  System.out.println("implemetation of sayHi() in MyClass");

 }

}

interface InterfaceA{  public void saySomething();  default public void sayHi(){   System.out.println("Hi from InterfaceA");  } }

interface InterfaceB{  default public void sayHi(){   System.out.println("Hi from InterfaceB");  } }

如果想指定调用哪一个接口的sayHi()方法,我们可以这么做:


public class MyClass implements InterfaceA, InterfaceB {

 public static void main(String[] args){

  MyClass mc = new MyClass();

  mc.sayHi();

 }

 

 @Override

 public void saySomething() {

  // TODO Auto-generated method stub

 }

 

 @Override

 public void sayHi(){

  InterfaceA.super.sayHi();

 }

}

interface InterfaceA{  public void saySomething();  default public void sayHi(){   System.out.println("Hi from InterfaceA");  } }

interface InterfaceB{  default public void sayHi(){   System.out.println("Hi from InterfaceB");  } }

答案是不是很简单呢?

 类似资料:
  • Java8包含了一个名为Defender methods的新特性,它允许在接口中创建默认方法实现。 对于在接口中添加新方法,他们不可能只添加一个新方法而不破坏以前的版本。因此,他说,为了迎合这一点,增加了默认方法的新特性。 现在我的问题基本上是,缺省方法只在需要向接口添加新方法而不破坏客户端代码时有用吗?或者它还有其他的用途吗?

  • 本文向大家介绍Java8默认方法Default Methods原理及实例详解,包括了Java8默认方法Default Methods原理及实例详解的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java8默认方法Default Methods原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Java 8 引入了新的语言特性

  • 本文向大家介绍Java8新特性之默认方法(default)浅析,包括了Java8新特性之默认方法(default)浅析的使用技巧和注意事项,需要的朋友参考一下 一、什么是默认方法,为什么要有默认方法 简单说,就是接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可。 为什么要有这个特性?首先,之前的接口是个双刃剑,好处是面向抽象而不是面向具体编程,缺陷是,

  • Java 8在接口中引入了默认方法实现的新概念。 添加此功能是为了向后兼容,以便可以使用旧接口来利用Java 8的lambda表达式功能。 例如,“List”或“Collection”接口没有“forEach”方法声明。 因此,添加此类方法将简单地破坏集合框架实现。 Java 8引入了默认方法,因此List/Collection接口可以具有forEach方法的默认实现,而实现这些接口的类不需要实现

  • 在IDE上执行程序时,它不会给出任何输出。我原以为它会给出。

  • 主要内容:1 Java8 forEach方法的介绍,2 Java8 forEach方法的声明,3 Java8 forEach方法的案例1,4 Java8 forEach方法的案例21 Java8 forEach方法的介绍 Java提供了一个新的forEach() 方法来迭代元素。它在Iterable和Stream接口中定义。这是Iterable接口中定义的默认方法。扩展Iterable接口的集合类可以使用forEach循环来迭代元素。 此方法采用单个参数,该参数是功能接口。因此,您可以将lamb