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

接口中default方法继承问题 - java

程序员文章站 2024-02-17 17:36:52
...

背景:在Eclipse F3看Servlet.Filter接口源码的时候,看到这个接口以为单纯只是个方法接口,原来这鬼东西,在类的大纲里面有个小D,简直一万只*在身边路过

对下面两个图片感到非常的奇怪,因为平时我们调用父类的方法直接就是super.方法() - 从没见过 父类.super.方法()

接口中default方法继承问题 - java

接口中default方法继承问题 - java

这是直接在Tomcat的jar包里面的Filter反编译出来真正的Filter类
接口中default方法继承问题 - java

语法

1. 父类接口.super – 代表父类接口

注意:只有父接口是有默认Default的方法时,这个才起作用,否则报错

interface Test1 {
    public default void test1() {
        System.out.println("Test1 test1()");
    }
}


interface Test2 extends Test1 {
    public default void test2() {
        System.out.println("Test2 test2()");
    }
    
    public default void test1() {
        System.out.println("Test2 test1()");
    }
}


interface Son implements Test2 {
    public void test() {
        Test2.super.test1();
        Test2.super.test2();
    }
    
    public static void main(String[] args){
        new Son().test();
    }
}

  运行结果 - 表明 父接口.super → 父接口 而不是 爷爷接口
接口中default方法继承问题 - java

2. 父接口的同名同参方法 会被 继承的父类 覆盖

class Test1 {
	public  void test1() {
		System.out.println("Test1 test1()");
	}
}

interface Test2{	
	public default void test1() {
		System.out.println("Test2 test1()");
	}
}

public class Son extends Test1 implements Test2{
	public void test() {
		test1();
	}
	public static void main(String[] args) {
		new Son().test();
	}
}

  运行结果 – 表名父类覆盖父接口的同名方法
接口中default方法继承问题 - java


如果我就是想调用父接口的默认方法呢?直接使用1的方法

public class Son extends Test1 implements Test2{
	public void test() {
		test1();
		Test2.super.test1();
	}
	public static void main(String[] args) {
		new Son().test();
	}
}


  运行结果
接口中default方法继承问题 - java

3. 类同时继承两个含有同名的父接口默认方法 - 重写该方法

接口中default方法继承问题 - java

interface Father1 {
    public default void a(){}
}

interface Father2 {
    public default void a() {}
}

class Son implements Father1, Father2 {
    // 重写默认方法 
    @Override
	public void a() {
        //或者  Father1.a() ; Father2.a();
    }
}