程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

java(0)

标签  

暂无标签

日期归档  

2023-06(2)

猿来绘Java-28-接口中的静态方法和默认方法(JDK8新特性)

发布于2021-06-12 13:49     阅读(972)     评论(0)     点赞(10)     收藏(3)


Java8中,可以为接口添加静态方法和默认方法。从技术角度来说,这是完全合法的,只 

Java8中,可以为接口添加静态方法和默认方法。从技术角度来说,这是完全合法的,只是它看起来违反了接口作为一个抽象定义的理念。

 

接口中的静态方法

使用 static 关键字修饰。 可以通过接口直接调用静态方法,并执行其方法体。我们经常在相互一起使用的类中使用静态方法。可以在标准库中找到像Collection/Collections或者Path/Paths这样成对的接口和类。

接口中的默认方法

默认方法使用 default 关键字修饰。可以通过实现类对象来调用。在已有的接口中提供新方法的同时,还保持了与旧版本代码的兼容性。

比如: java 8 API中对Collection、 List、 Comparator等接口提供了丰富的默认方法。

 

接口中定义的静态方法,只能通过接口来调用,不能通过实现类或其对象来调用,说白了,接口中的静态方法不是给实现类用的

通过实现类的对象,可以调用接口中的默认方法

类优先原则:

如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,那么子类在没有重写此方法的情况下,默认调用的是父类中的同名同参数的方法。

接口冲突:

如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下报错。这就需要我们必须在实现类中重写此方法

Duplicate default methods named defaultMethod3 with the parameters () and () are inherited from the types InterfaceB and InterfaceA

如何在子类(或实现类)的方法中调用父类、接口中被重写的方法 --- 例如 CompareA.super.method3();

代码示例及其UML图

  1. //InterfaceA.java
  2. package com.ylaihui.oop13;
  3. public interface InterfaceA {
  4. // 静态方法
  5. public static void staticMethod(){
  6. System.out.println("interface staticMethod...");
  7. }
  8. // 默认方法
  9. public default void defaultMethod(){
  10. System.out.println("interface defaultMethod...");
  11. }
  12. public default void defaultMethod1(){
  13. System.out.println("interface defaultMethod1...");
  14. }
  15. public default void defaultMethod2(){
  16. System.out.println("interface defaultMethod2...");
  17. }
  18. public default void defaultMethod3(){
  19. System.out.println("interface defaultMethod3...");
  20. }
  21. }
  1. //SuperClass.java
  2. package com.ylaihui.oop13;
  3. public class SuperClass {
  4. public void defaultMethod2(){
  5. System.out.println("SuperClass defaultMethod...");
  6. }
  7. }

 

  1. //SubClassTest.java
  2. package com.ylaihui.oop13;
  3. class subClass extends SuperClass implements InterfaceA,InterfaceB{
  4. public void defaultMethod1(){
  5. System.out.println("subClass defaultMethod1...");
  6. }
  7. // 如果实现类实现了多个接口,而这多个接口中定义了同名同参数的默认方法,
  8. // 那么在实现类没有重写此方法的情况下,报错。-->接口冲突。
  9. // 这就需要我们必须在实现类中重写此方法
  10. public void defaultMethod3() {
  11. System.out.println("subClass defaultMethod3...");
  12. }
  13. public void Method(){
  14. // 在子类(或实现类)的方法中调用父类、接口中被重写的方法
  15. InterfaceA.super.defaultMethod3();
  16. }
  17. }
  18. public class SubClassTest {
  19. public static void main(String[] args) {
  20. subClass sc = new subClass();
  21. // 接口中定义的静态方法,只能通过接口来调用,不能通过实现类或其对象来调用
  22. // sc.staticMethod(); // The method staticMethod() is undefined for the type subClass
  23. InterfaceA.staticMethod();
  24. // 通过实现类的对象,可以调用接口中的默认方法
  25. sc.defaultMethod();
  26. // 如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写以后的方法
  27. sc.defaultMethod1(); // subClass defaultMethod1...
  28. // 如果子类(或实现类)继承的父类和实现的接口中声明了同名同参数的默认方法,
  29. // 那么子类在没有重写此方法的情况下,
  30. // 默认调用的是父类中的同名同参数的方法,而非调用的接口中的默认方法
  31. sc.defaultMethod2(); // SuperClass defaultMethod...
  32. }
  33. }

 

代码输出

interface staticMethod...

interface defaultMethod...

subClass defaultMethod1...

SuperClass defaultMethod...

原文链接:https://blog.csdn.net/asdfjklingok/article/details/117744551



所属网站分类: 技术文章 > 博客

作者:java王侯

链接:http://www.javaheidong.com/blog/article/222095/ba358e2abbb7a18f9798/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

10 0
收藏该文
已收藏

评论内容:(最多支持255个字符)