You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中如何调用被子类重写的抽象类中的方法?

如何在不修改B类的前提下调用A类的m1()方法?
interface I1 {
    void m1();
}

interface I2 {
    void m2();
}

abstract class A implements I1, I2 {
    public void m1() {
        System.out.println("Inside A: m1()");
    }
}

class B extends A {
    public void m1() {
        System.out.println("Inside B: m1()");
    }
    public void m2() {
        System.out.println("Inside B: m2()");
    }
}

public class Test {
    
    public static void main(String[] args) {
        
        // invoke A's m1()
        A a = new B();
        a.m1();
        
    }
}

当前代码中,由于动态方法分派(运行时多态),执行a.m1()时会调用B类重写后的m1()方法。要求在不修改B类的前提下,仅调用A类中的m1()方法。

方案1:使用Java反射机制

通过反射可以绕过动态分派逻辑,直接调用父类A的m1()方法。修改Test类的main方法如下:

public class Test {
    public static void main(String[] args) throws Exception {
        A a = new B();
        
        // 获取A类的m1()方法
        java.lang.reflect.Method methodA = A.class.getDeclaredMethod("m1");
        // 传入B类实例调用方法
        methodA.invoke(a);
    }
}

方案2:使用MethodHandle(Java 7及以上)

MethodHandle提供了更高效的方法调用方式,同样可以实现调用父类的目标方法:

import java.lang.invoke.MethodHandles;
import java.lang.invoke.MethodType;

public class Test {
    public static void main(String[] args) throws Throwable {
        A a = new B();
        
        // 创建指向A类m1()方法的句柄
        java.lang.invoke.MethodHandle mh = MethodHandles.lookup()
                .findSpecial(A.class, "m1", MethodType.methodType(void.class), B.class);
        // 调用方法句柄
        mh.invokeExact(a);
    }
}

这两种方法都无需修改B类,直接在调用端实现对A类m1()方法的调用。

内容的提问来源于stack exchange,提问作者Shri

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:35:16