在Java中继承的静态方法中获取类的名称

时间:2018-09-21 11:32:19

标签: java inheritance java-8 static

说我想用Java解决一堆Project Euler问题,而不是给每个问题类一个自己的main方法的样板,而是继承它并使用一个“ solve”方法。

有没有办法让问题类的名称与解决方案一起打印出来?

我所拥有的:

abstract class Problem {

    private static String problemName = ???

    public static void main(String[] args) {
//  If I could summon an instance of the sub-class then it would be easy
//        Problem p = new ... what?
        System.out.println(problemName + ": " + solve());
    }

    abstract static long solve();
// oops, you can't do abstract static in Java :(
}

然后

public class Euler_001 extends Problem {
    static long solve() {...}
}

问题是要获取this answer中给出的类名的各种黑客都会返回“问题”,而不是“ Euler_001”。

我想我必须实例化问题类,但是那我该怎么做?

2 个答案:

答案 0 :(得分:1)

当父级需要调用子级时,静态上下文无助于继承。将实例与抽象结合使用:

abstract class Problem {

    public static void main(String[] args) throws Exception {

        Problem problem;

        //Now, depending on where the exact problem is specified:

        //Class known at compile time
        problem = new Euler_001();

        //Class passed as parameter
        problem = (Problem) Class.forName(args[0]).getConstructor().newInstance();

        System.out.println(problem.getProblemName() + ": " + problem.solve());
    }

    abstract long solve();
    abstract String getProblemName();
}

子类将提供一个覆盖抽象方法的常规实现:

class Euler_001 extends Problem {
    @Override
    long solve() {
         return 0;
     }

    @Override
    String getProblemName() {
        return "????";
    }
}

根据您的配置方法,您可以在父级的main方法内基于类名创建具体类的实例。

这样,Problem类可以通过以下方式调用:

java com.mypackage.Problem "com.mypackage.Euler_001"

答案 1 :(得分:0)

静态变量和方法不能被覆盖-它们将被替换。因此,根据我的理解,我们需要创建子类的实例。
我检查了-
        问题p =新的Euler_001();
        System.out.println(p.getClass()。getSimpleName()); //打印Euler_001