如何在不继承抽象类的情况下使用其中的非抽象方法
不继承抽象类时调用其非抽象方法的几种方案
嘿,这个问题我刚好有几个实用的解法,咱们一个个说清楚,每个方案都配代码示例,方便你直接参考~
方案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
相关产品推荐
相关产品推荐

