如何通过派生类对象调用抽象类Base中的fun方法?
如何通过派生类对象调用抽象类中的fun方法
没问题,我来帮你搞定这个问题~你当前的代码里,Derived类重写了Base的fun()方法,所以直接用Derived实例调用fun()时,默认会执行子类的实现。要调用抽象类Base中的fun()方法,你可以试试下面几种方法:
方法1:在子类内部用super关键字调用
如果你想在Derived的方法里触发Base的fun(),直接用super.fun()就可以,这是Java里调用父类重写方法的标准方式。修改后的Derived类如下:
class Derived extends Base { void fun(){ // 先调用Base类的fun方法 super.fun(); System.out.println("Derived fun() called"); } }
当你执行new Derived().fun()时,会先打印Base fun() called,再输出子类的内容。
方法2:用反射机制直接调用Base类的fun方法
如果想在外部代码里直接调用Base的fun()(不依赖子类内部的super调用),可以用Java反射绕过动态绑定:
public class Main { public static void main(String[] args) throws Exception { Derived d = new Derived(); // 获取Base类中声明的fun方法 java.lang.reflect.Method baseFunMethod = Base.class.getDeclaredMethod("fun"); // 调用该方法,传入Derived实例对象 baseFunMethod.invoke(d); } }
这段代码执行后会直接打印Base fun() called,因为反射明确指定了调用Base类的方法,不受子类重写的影响。
额外补充:调用最顶层父类A的fun方法
如果之后你还需要调用A类的fun(),Java不允许直接写super.super.fun(),但可以在Base类里封装一个方法:
abstract class Base extends A { void fun(){ System.out.println("Base fun() called"); } // 封装调用A类fun的方法 void callAFun() { super.fun(); // 这里的super指向A类 } }
然后在Derived里调用super.callAFun(),或者直接用new Derived().callAFun(),就能触发A类的fun()了。
原理说明
Java的方法调用是动态绑定的,程序会根据对象的实际类型(而不是声明类型)来选择执行哪个版本的方法。所以默认情况下,Derived实例调用fun()会执行子类的实现。而super关键字或者反射,都是用来绕过动态绑定,直接调用父类的方法实现。
内容的提问来源于stack exchange,提问作者Ganesh Chowdhary Sadanala
相关产品推荐
相关产品推荐

