目录
一、静态方法
二、默认方法
三、知识点
四、练习(接口冲突的解决方式)
Java8中,可以为接口添加静态方法和默认方法
使用static关键字修饰
接口中定义的静态方法,只能通过接口来调用
使用default关键字修饰
通过实现类的对象,可以调用接口中的默认方法
如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写的方法
public interface CompareA { //静态方法 public static void method1() { System.out.println("CompareA:北京"); } //默认方式 public default void method2() { System.out.println("CompareA:上海"); } default void method3() { System.out.println("CompareA:上海"); } } public class SubClassTest { public static void main(String[] args) { SubClass s = new SubClass(); // s.method1(); //没有为类型 SubClass 定义方法 method1() // SubClass.method1(); //接口中定义的静态方法,只能通过接口来调用 CompareA.method1(); //通过实现类的对象,可以调用接口中的默认方法 s.method2(); //如果子类(实现类)继承的父类和实现的接口中声明了同名同参数的方法,那么子类在没有重写此方法的情况下,默认调用的是父类中同名同参数的方法 —— 类优先原则 //如果实现类实现了多个接口,而这个接口中定义了同名同参数的默认方法,那么在实现类没有重写此方法的情况下,会报错。 ——> 接口冲突 //需要我们必须在实现类中重写此方法 s.method3(); } } class SubClass extends SuperClass implements CompareA,CompareB{ public void method2() { System.out.println("SubClassA:上海"); //如果实现类重写了接口中的默认方法,调用时,仍然调用的是重写的方法 } public void method3() { System.out.println("SubClassA:深圳"); } //如何在子类(实现类)的方法中调用父类、接口中被重写的方法? public void myMethod() { method3(); //自己定义的重写的方法 super.method3(); //调用的父类中声明的方法 //调用接口中的默认方法 CompareA.super.method3(); CompareB.super.method3(); } } public class SuperClass { public void method3() { System.out.println("SuperClass:北京"); } } public interface CompareB { default void method3() { System.out.println("CompareA:上海"); } }
interface Filial{//孝顺的 default void help() { System.out.println("老妈,我来救你了"); } } interface Spoony{//痴情的 default void help() { System.out.println("媳妇,别怕,我来救你了"); } } class Father{ public void help() { System.out.println("儿子,救我媳妇!"); } } class Man extends Father implements Filial,Spoony{ @Override public void help() { System.out.println("我该救谁呢?"); Filial.super.help(); Spoony.super.help(); } }