接口中default方法继承问题 - java
程序员文章站
2024-02-17 17:36:52
...
背景:在Eclipse F3看Servlet.Filter接口源码的时候,看到这个接口以为单纯只是个方法接口,原来这鬼东西,在类的大纲里面有个小D,简直一万只*在身边路过
对下面两个图片感到非常的奇怪,因为平时我们调用父类的方法直接就是super.方法() - 从没见过 父类.super.方法()
这是直接在Tomcat的jar包里面的Filter反编译出来真正的Filter类
语法
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 → 父接口 而不是 爷爷接口
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();
}
}
运行结果 – 表名父类覆盖父接口的同名方法
如果我就是想调用父接口的默认方法呢?直接使用1的方法
public class Son extends Test1 implements Test2{
public void test() {
test1();
Test2.super.test1();
}
public static void main(String[] args) {
new Son().test();
}
}
运行结果
3. 类同时继承两个含有同名的父接口默认方法 - 重写该方法
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();
}
}
下一篇: Android 隐藏桌面图标【无图标】