`
QING____
  • 浏览: 2231930 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JAVA中默认方法

    博客分类:
  • JAVA
 
阅读更多

    JDK 8中,对接口的设计做了一项非常重要的变更:支持“默认方法”(Default Method),即可以在接口上声明和实现方法,这一点有点类似于抽象类、抽象方法,可以简化类的多个接口扩展的复杂度,潜在淡化JAVA有关多继承的缺陷,此外默认方法在lamda表达式使用方面非常便利。

 

    此后,我们可能需要改变有些认知,比如“接口中不能有方法实现”等。

 

    1、默认方法:在接口中可以声明修饰域为public default的方法实现体。

 

public interface Animal {
    public default void run() {
        System.out.println("Animal default run");
    }
}

public interface Bird {
    public void fly();

    public default void run() {
        System.out.println("Bird default run");
    }

    public static void tweet(String voice) {
        System.out.println("Bird tweets:" + voice);
    }
}

public abstract class Poultry implements Bird,Animal {

    //抽闲类,可以直接改变默认方法的实现,覆盖所有接口的同名默认方法
    public abstract void run();

    public void bird() {
        Bird.super.run();//也可以调用接口的默认实现
        Animal.super.run();
        //可以通过接口直接使用其static方法
        Bird.tweet("I am poultry!");
    }
}

 

 

    如例所示,接口中,可以声明“default”默认方法实现,这与抽象类中的方法很像,默认方法可以被接口的实现者直接调用,也可以被继承它的子接口或者实现类重写,甚至实现接口的抽象类可以将default方法变更为抽象方法以便强制子类必须实现。

 

    

    接口的实现类中,无论是否重写默认方法,都可以通过类似于“Bird.super.run()”的方式访问父接口的默认方法实现。同时,如果一个类,实现了多个接口,且这些接口中有重名的默认方法,仍然可以通过上述方式访问相应接口的默认方法。

 

    由此可见,如果你在设计时发现,接口的子类具有某种共同的行为,你可以将其设计为“默认方法”,此后你则不需要设计抽象类来完成此要求,特别是此接口被多种不同的类实现时,可以避免在多个抽象类重复实现。

 

    2、静态方法

    在此前,static方法需要声明在类或者抽象类中,接口是不支持的,尽管接口中可以声明public static类型的属性。在接口中支持静态方法,跟“默认方法”一样,我们则不需要在像以前那样使用单独的类或者抽象类来完成此功能,在一定程度上简化了程序设计。

 

    无论是默认方法,还是静态方法,其默认修饰域为public。

 

    我们可以在lamba语法支持下,基于默认方法、方法引用等特性,更便捷的编写程序。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics