不继承抽象类且不使用静态内容,如何从具体类调用抽象类方法?
解决方案:用匿名内部类实现调用
当然有可行的方法!虽然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
相关产品推荐
相关产品推荐

