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

如何在不继承抽象类的情况下使用其中的非抽象方法

不继承抽象类时调用其非抽象方法的几种方案

嘿,这个问题我刚好有几个实用的解法,咱们一个个说清楚,每个方案都配代码示例,方便你直接参考~

方案1:创建抽象类的匿名内部类实例

抽象类不能直接实例化,但我们可以用匿名内部类快速实现它的抽象方法(哪怕是空实现),然后就能调用非抽象方法了。

先定义抽象类:

abstract class MyAbstractClass {
    // 我们要调用的非抽象方法
    public void nonAbstractMethod() {
        System.out.println("抽象类中的非抽象方法执行啦!");
    }

    // 抽象类必须有的抽象方法,必须被实现
    public abstract void abstractMethod();
}

然后在另一个类里调用:

public class CallerClass {
    public static void main(String[] args) {
        // 创建匿名内部类,实现抽象方法(这里空实现就行)
        MyAbstractClass abstractInstance = new MyAbstractClass() {
            @Override
            public void abstractMethod() {
                // 不需要逻辑的话,空实现即可
            }
        };
        
        // 直接调用非抽象方法
        abstractInstance.nonAbstractMethod();
    }
}

方案2:将非抽象方法改为static(业务场景允许的话)

如果抽象类的非抽象方法不需要依赖类的非静态成员变量,那可以把它改成静态方法,这样不需要创建实例,直接通过类名就能调用。

修改抽象类:

abstract class MyAbstractClass {
    // 改成静态非抽象方法
    public static void nonAbstractMethod() {
        System.out.println("静态非抽象方法执行啦!");
    }

    public abstract void abstractMethod();
}

调用代码:

public class CallerClass {
    public static void main(String[] args) {
        // 直接通过类名调用,不需要实例
        MyAbstractClass.nonAbstractMethod();
    }
}

⚠️ 注意:静态方法不能访问类的非静态成员(比如非静态变量、非静态方法),如果原方法依赖这些,这个方案就不适用。

方案3:用静态工厂方法封装实例创建逻辑

如果需要多次调用,每次写匿名内部类有点麻烦,我们可以在抽象类内部写一个静态工厂方法,提前封装好实现抽象方法的实例,调用方直接拿实例就行。

抽象类改造:

abstract class MyAbstractClass {
    public void nonAbstractMethod() {
        System.out.println("抽象类中的非抽象方法执行啦!");
    }

    public abstract void abstractMethod();

    // 静态工厂方法,返回一个默认实现的实例
    public static MyAbstractClass getDefaultInstance() {
        return new MyAbstractClass() {
            @Override
            public void abstractMethod() {
                // 这里可以写默认的实现逻辑,或者空实现
            }
        };
    }
}

调用代码:

public class CallerClass {
    public static void main(String[] args) {
        // 通过工厂方法获取实例
        MyAbstractClass abstractInstance = MyAbstractClass.getDefaultInstance();
        abstractInstance.nonAbstractMethod();
    }
}

这个方案的好处是把实例创建的逻辑封装起来,调用方代码更简洁,也方便统一修改默认实现。

额外注意点

  • 要调用的非抽象方法必须是public/protected/包访问权限(如果调用类和抽象类在同一个包下),private方法只能在抽象类内部访问,外部无法调用。
  • 如果抽象类的非抽象方法依赖实例变量,那方案2(静态方法)就不可行,必须用方案1或3创建实例来调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:55:47