Java中如何在抽象基类main方法中实例化派生类对象?
解决方案:通过反射在基类main中实例化对应子类
核心思路
执行java MOne 5这类命令时,JVM实际运行的是目标子类(MOne/MTwo/MThree),但子类继承了基类的main方法。我们可以通过反射机制获取当前运行的子类类名,动态实例化子类对象,再调用其实现的multiply方法。
完整代码实现
抽象基类 Calculation
public abstract class Calculation { // 抽象乘法方法,由子类实现具体逻辑 public abstract int multiply(int num); public static void main(String[] args) { // 参数合法性校验 if (args.length < 1) { System.err.println("缺少数字参数,请输入形如:java MOne 5 的命令"); return; } int inputNum; try { inputNum = Integer.parseInt(args[0]); } catch (NumberFormatException e) { System.err.println("参数必须是整数"); return; } try { // 获取当前运行的子类类名 String className = Thread.currentThread().getStackTrace()[1].getClassName(); // 反射实例化子类对象 Calculation calculation = (Calculation) Class.forName(className) .getDeclaredConstructor() .newInstance(); // 调用子类实现的multiply方法并输出结果 System.out.println(calculation.multiply(inputNum)); } catch (Exception e) { System.err.println("实例化子类失败:" + e.getMessage()); e.printStackTrace(); } } }
子类 MOne
public class MOne extends Calculation { @Override public int multiply(int num) { return num * 1; } }
子类 MTwo
public class MTwo extends Calculation { @Override public int multiply(int num) { return num * 2; } }
子类 MThree
public class MThree extends Calculation { @Override public int multiply(int num) { return num * 3; } }
运行验证
编译所有类后,执行对应命令:
java MOne 5→ 输出5java MTwo 5→ 输出10java MThree 5→ 输出15
补充方案
除了栈遍历获取类名,还可以通过JVM系统属性直接获取执行类名,避免栈遍历开销:
String commandLine = System.getProperty("sun.java.command"); String className = commandLine.split("\\s+")[0];
内容的提问来源于stack exchange,提问作者Michèle S.
相关产品推荐
相关产品推荐

