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

不继承抽象类且不使用静态内容,如何从具体类调用抽象类方法?

解决方案:用匿名内部类实现调用

当然有可行的方法!虽然Vehicle是抽象类不能直接new实例,但我们可以通过匿名内部类的方式创建它的子类实例,这样既不用让Driver继承Vehicle,也完全不依赖静态内容,就能调用maintain方法了。

具体代码实现

先保留你的抽象类:

public abstract class Vehicle { 
    void maintain(String str) { 
        System.out.println(str); 
    } 
}

然后修改Driver类的main方法,用匿名内部类创建Vehicle的实例并调用方法:

public class Driver { 
    public static void main(String[] args) { 
        // 创建Vehicle的匿名内部类实例
        Vehicle vehicle = new Vehicle() {};
        // 调用maintain方法
        vehicle.maintain("正在维护车辆...");
    } 
}

原理说明

匿名内部类是Java里的语法糖,它会在编译时自动生成一个Vehicle的匿名子类,我们通过new Vehicle() {}的方式其实是创建了这个子类的实例。因为这个子类继承了Vehicle,所以能直接调用父类的maintain方法,而我们的Driver类并没有和Vehicle产生继承关系,完全符合你的要求。

备选方案:反射(不推荐常规场景使用)

如果非要绕开显式子类的方式,也可以用反射直接调用maintain方法,但这种方式破坏了封装性,只适合特殊调试场景:

import java.lang.reflect.Method;

public class Driver { 
    public static void main(String[] args) throws Exception { 
        // 获取Vehicle类的maintain方法
        Method maintainMethod = Vehicle.class.getDeclaredMethod("maintain", String.class);
        // 创建Vehicle的匿名内部类实例(反射调用需要实例对象)
        Vehicle vehicle = new Vehicle() {};
        // 通过反射调用方法
        maintainMethod.invoke(vehicle, "通过反射维护车辆...");
    } 
}

不过还是优先推荐匿名内部类的方式,代码更清晰、符合Java的面向对象设计规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:29:03