public class TestA {
public static void main(String[] args) {
TestA a = new TestA();
a.start();
}
public void start(){
B b = new B();
b.funA();
}
public abstract class A {
public void funA(){
System.out.println("I'm funA in A ");
funB();
}
abstract void funB();
}
public class B extends A{
@Override
public void funA() {
super.funA();
}
@Override
void funB() {
System.out.println("I'm funB in B");
}
}
}
我就是想问为什么调用父类方法后,父类为什么调用的是子类的方法,不是调用抽象么,抽象不是不能被调用么
该回答引用ChatGPT
在这段代码中,父类 A 中的方法 funA() 被子类 B 重写了,因此在子类 B 中调用 funA() 方法时,实际上是调用的子类 B 中的方法。具体来说,当在子类 B 中调用 super.funA() 时,会首先调用父类 A 中的 funA() 方法,然后在父类 A 的 funA() 方法中调用了抽象方法 funB(),而子类 B 中已经实现了 funB() 方法,因此在这里调用的是子类 B 中的 funB() 方法。
抽象方法不能被直接实例化调用,但是在非抽象方法中可以调用抽象方法,而具体的实现会由子类提供。在这个例子中,父类 A 中的 funA() 方法是非抽象方法,因此可以调用抽象方法 funB(),而具体的实现由子类 B 提供。