Java 继承main方法

Java 继承main方法,java,inheritance,main-method,Java,Inheritance,Main Method,我想定义一个基类,该基类定义一个实例化该类的主方法,并运行一个方法。不过有几个问题。下面是基类: public abstract class Strategy { abstract void execute(SoccerRobot robot); public static void main(String args) { Strategy s = new /*Not sure what to put here*/(); s.execut

我想定义一个基类,该基类定义一个实例化该类的主方法,并运行一个方法。不过有几个问题。下面是基类:

public abstract class Strategy
{
    abstract void execute(SoccerRobot robot);

    public static void main(String args)
    {
        Strategy s = new /*Not sure what to put here*/();
        s.execute(new SoccerRobot())
    }
}
下面是一个示例派生类:

public class UselessStrategy
{
    void execute(SoccerRobot robot)
    {
        System.out.println("I'm useless")
    }
}
它定义了一个简单的execute方法,当作为主应用程序的一个函数使用时,应该在主方法中调用该方法。然而,为了做到这一点,我需要在基类的主方法中实例化派生类。这似乎是不可能的

我不希望对每个派生类都重复main方法,因为它感觉有些不必要


有没有正确的方法可以做到这一点?

您不能实例化一个抽象类,但肯定可以从基类实例化一个派生类。所以只需从类定义中删除抽象

public class UselessStrategy

Strategy s = new UselessStrategy();

将main方法移出到一个单独的类中。独立关注点
战略(名称说明一切)
启动器(将组件组装在一起并触发执行)

静态方法(如“main”)不是继承的,而是可以直接调用的。作为一种解决方法,您可以将类名参数化为main方法的参数:

public static void main(String args) throws Exception
{
  String className = (args.length > 0) ? args[0] : 'UselessStrategy';
  Strategy s = (Strategy) Class.forName(className).newInstance();
  s.execute(new SoccerRobot())
}

如果无法使用
Class.forName
,则根据Andreas\D的评论,维护类名映射可以提供一个查找表:

private static Map<String, Class<? extends Strategy>> STRATEGY_NAME =
    new HashMap<String, Class<? extends Strategy>>();

static {
    STRATEGY_NAME.put("Useless", UselessStrategy.class);
    STRATEGY_NAME.put("Better", BetterStrategy.class);
}

public static void main(String args[]) throws Exception {
    String className = (args.length > 0) ? args[0] : null;
    Class<? extends Strategy> klass = STRATEGY_NAME.get(className);
    if (klass == null) klass = UselessStrategy.class;
    Strategy s = klass.newInstance();
    s.execute();
}

private static Map从哪里调用主方法?如果它需要参数,那么您可以根据这些参数决定具体的策略,实例化该策略类并对其调用
execute
方法

将您希望执行的代码放在其他地方,最好是一个非静态方法,然后调用它
main()
不应以这种方式使用


我建议创建一个单独的策略类来代替main。

您可以在子类的静态块中定义该类

public abstract class Strategy
{
    protected static Class<? extends Strategy> instanceClass;

    abstract void execute(SoccerRobot robot);

    public static void main(String args)
    {
        Strategy s = instanceClass.newInstance()
        s.execute(new SoccerRobot())
    }
}

你的设计似乎有点落后。用特定的策略实例化一个
SoccerRobot
不是更有意义吗?SoccerRobot代表机器人的物理属性,而不是应用程序本身。它提供机器人的高级控制(navigateTo、GetBalangle等)。所以我认为它不应该采取这种策略。第一个错误是复制粘贴操作。如果我要从Strategy派生另一个类,比如说
有用的Strategy
,我希望基类的main方法能够工作。我希望main方法知道它是从哪个类调用的,并实例化所述类。基类的main方法与任何其他静态方法一样,不“工作”于任何派生类,只“工作”于自身。但是由于人们已经发明了命令行参数,所以在您的案例中不需要有多个主要方法。使用参数作为工厂创建策略的输入。
Class.forName
在我的平台上是不允许的。
Class.forName
不是必需的,还有其他方法可以将参数向量传递的键映射到具体的类。这是像J2ME或android这样的特殊Java风格吗?还是有一个限制性的SecurityManager?一些特殊的java风格,确切地说,嗯,你应该在问题中加上这个名字,也许还有一个标签;它似乎是一个专门的Java实现。执行程序时调用
main
方法。将编译
UselessStrategy
类,该类有望调用
Strategy
中的
main
方法
public abstract class Strategy
{
    protected static Class<? extends Strategy> instanceClass;

    abstract void execute(SoccerRobot robot);

    public static void main(String args)
    {
        Strategy s = instanceClass.newInstance()
        s.execute(new SoccerRobot())
    }
}
public class UselessStrategy extends Strategy
{
    static {
        instanceClass = UselessStrategy.class;
    }

    void execute(SoccerRobot robot)
    {
        System.out.println("I'm useless")
    }
}