关于接口与父类、子类的实现关系以及如何调用
public class HelpSomebody {
public static void main(String[] args) {
father Baba = new father();
Baba.choose();
me M = new me();
M.choose();
M.method1();
}
}
//定义两个接口
interface A {
public default void choose() {
System.out.println("我救我妈!");
}
}
interface B {
//public 可以省略
default void choose() {
System.out.println("我救老婆!");
}
}
//定义一个父类
class father implements A, B {
//必须重写
@Override
public void choose() {
System.out.println("Baba要救我老婆!!");
}
//父类定义的方法
public void method1() {
A.super.choose();//记住这种写法 (这是如何调用接口的默认方法)
}
}
//子类继承父类
class me extends father implements A, B {
@Override
public void choose() {
super.choose();
// A.super.choose();
// Illegal reference to super method choose() from type B, cannot bypass the
// more specific override from type father
// A.super点不出来东西、但是看教程可以点出来(关于子类调用接口的方法)
// 视频里是A.super.choose();
}
@Override
public void method1() {
super.method1(); // 我救我妈
System.out.println("*******");
// 暂时留一个坑
method1();
// 这里不知道是为啥,我感觉是递归调用错误,比较明显
// *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at ./open/src/java.instrument/share/native/libinstrument/JPLISAgent.c line: 873
// *** java.lang.instrument ASSERTION FAILED ***: "!errorOutstanding" with message transform method call failed at ./open/src/java.instrument/share/native/libinstrument/JPLISAgent.c line: 873
// #
// # A fatal error has been detected by the Java Runtime Environment:
// #
// # EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ff83ceff52e, pid=13248, tid=7444
// #
// # JRE version: Java(TM) SE Runtime Environment (14.0.2+12) (build 14.0.2+12-46)
// # Java VM: Java HotSpot(TM) 64-Bit Server VM (14.0.2+12-46, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64)
// # Problematic frame:
// # V [jvm.dll+0x58f52e]
}
```
/*
* 输出如下 上面的错误只出现了一次。
* 已经确定是StackOver,递归调用问题!
*
* Baba要救我老婆!! Baba要救我老婆!! 我救我妈!
*******
* 我救我妈!
*******
* 我救我妈!
*******
* 我救我妈!
*******
* 我救我妈! 。 。 。 。 。
*
*/
}