JDK1.8 接口新特性:default方法和static方法

接口的组成

在JDK1.8之前,接口中只有两部分内容:
(1)常量:固定修饰符public static final
(2)抽象方法:固定修饰符public abstract
在JDK1.8之后,接口新增非抽象方法:default方法和static方法

为什么接口中药增加默认方法和静态方法

如果接口中只能定义抽象方法,当修改接口时,该接口的所有实现类都会受到影响,为了减小这种影响,所以才采用了这种方式

默认方法:被public default修饰的默认方法

  • 接口中public修饰符可以省略,default修饰符必须写
  • 接口的实现类中可以重写default方法,重写时default修饰符必须不能加
  • 接口的默认方法只能通过接口实现类或实现类的实例对象进行调用,调用方式见下面的代码:
@FunctionalInterface
public interface MyInterface {
    
    
    void go();
    
    default void defaultTest() {
    
    
        System.out.println("default方法");
    }
}

class MyInterfaceImpl implements MyInterface {
    
    
    @Override
    public void go() {
    
    
        System.out.println("抽象方法实现");
        
    }

    @Override
    public void defaultTest() {
    
    
    	System.out.println("覆写接口默认方法");
        //super.defaultTest(); 不可以直接调用默认方法
        MyInterface.super.defaultTest();//接口实现类的重写方法中,super不能直接调用接口默认方法,只能通过接口名.super.默认方法    
    }
}
public abstract class MainDemo{
    
    
    public static void main(String[] args) {
    
    
        MyInterface myInterface=()-> System.out.println("122");
        myInterface.defaultTest(); 
    }
}

静态方法:被public static修饰的静态方法

public interface MyInterface {
    
    
    static void staticTest() {
    
    
        System.out.println("我是接口的静态方法");
    }
}
class MyInterfaceImpl implements MyInterface {
    
    
    //注意:这里不是重写接口的静态方法,只是定义了一个静态方法相同签名的方法而已
    static void staticTest() {
    
    
        System.out.println("我和接口的静态方法是两个不同的方法,接口静态方法不能被继承");
    }
}
class Demo {
    
    
    public static void main(String[] args) {
    
    
        MyInterface.staticTest();
    }
}
  • 接口中public修饰符可以省略,static修饰符必须写
  • 接口的静态方法不能被接口实现类继承,只能通过如下方式调用:接口名.静态方法
  • 接口的实现类中可以写一个与静态方法相同的静态方法,互不影响
    注意:
    (1)方法的重写是对实例方法来说的,静态方法不存在重写的概念,因为静态方法是属于类级别的方法,所有实例对象都拥有该方法。
    (2)类的静态方法可以被继承,但静态的静态的方法不能被继承,只能通过接口名.静态方名 进行调用

接口易错问题

  • 当继承的父类和接口有相同签名的方法时,优先使用父类的方法,接口实现类中因为继承了父类的方法,甚至都可以不写重写该接口的方法
public interface MyInterface {
    
    
    void go();
}
class MyInterfaceImpl extends Father implements MyInterface {
    
    
    
}
class Father {
    
    
    public void go() {
    
    
        System.out.println("我是父类");
    }
}
  • 当接口的父接口中也有同样的默认方法时,就近原则调用子接口的方法
  • 当多个接口中有相同的方法签名,且被同一个类实现时,必须在实现类中通过重写方法解决冲突问题,重复方法中可以通过 接口名.super.方法名()的方式调用接口中的各默认方法

接口和抽象类的区别

  • 接口使用interface修饰,抽象类使用abstract修饰
  • 接口可以继承多个接口,抽象类是单继承
public interface MyInterface extends Runnable, RandomAccess {
    
    
}
  • 一个类可以实现多个接口,但只能继承一个抽象类
  • JDK1.8之前,接口中必须只能有抽象方法,不能有方法体
    JDK1.8开始,接口中也可以有静态方法和默认方法,但接口的静态方法不能被继承,而抽象类的静态方法可以被继承

猜你喜欢

转载自blog.csdn.net/user2025/article/details/108957493