欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java8中的default方法详解

程序员文章站 2024-03-01 19:50:58
java 8新增了default方法,它可以在接口添加新功能特性,而且还不影响接口的实现类。下面我们通过例子来说明这一点。 复制代码 代码如下: public clas...

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");
 }
}

答案是不是很简单呢?