了解类变量的inheritance

我正在用Java构建Challenge24Solver类。 逻辑本身工作并找到预期的解决方案(具有任意数量的参数)。 无论如何,这部分项目是按照我的预期运作的。

问题来自解决方案表示的问题。 可以公平地说,我已经用Python完成了这个项目并且决定尝试用Java作为一种介绍,这可能是问题,我也试图像Python那样做。

以下是我的一些课程:

 abstract class Operation { \\ Basic operation class static String token; abstract public double operate (double x, double y); } class AddOp extends Operation { static String token = "+"; public double operate (double x, double y) { return x+y; } } //other operation classes SubOp, MulOp, DivOp class Challenge24Step { // represents one step in a solution Operation operator; double x, y; //operands double value; //the value of the step (x operator y) public Challenge24Step (Operation operator, double x, double y) { this.operator = operator; // constructor code; } public String toString () { return String.format("%s %s %s = %s", this.x, this.operator.token, this.y, this.value); } } 

问题是它仍然从Operation类获取令牌:“null”

我理解这可能是因为operator被声明为Operation,但我不明白它为什么不通过标准inheritance:实例,类,每个超类

如何重新排列脚本以便使用更具体的操作类标记?

您不能在基类中创建token静态,因为每个所有inheritance的类都会有一个标记。 您需要将其设为实例变量。 您甚至无法将其放在静态方法中,因为Java中的static方法不可覆盖。

在Java中,变量不可覆盖。 如果inheritance一个类并使用相同的名称添加变量,派生类中的变量将隐藏 ,而不是覆盖基类中的变量。

要解决这个问题,请在基类中创建一个abstract方法,在派生类中提供一个实现,然后返回所需的值。 如果这样做,您可以用接口替换抽象类,因为它中没有变量或实现:

 interface Operation { // Basic operation class String getToken(); double operate (double x, double y); } class AddOp implements Operation { public String getToken() {return "+"; } public double operate (double x, double y) { return x+y; } } 

或者,将其保留在基类中,添加一个获取令牌值的构造函数,并在其中指定:

 abstract class Operation { // Basic operation class public final String token; abstract public double operate (double x, double y); protected Operation(String token) {this.token = token; } } class AddOp extends Operation { public AddOp() { super("+"); } public double operate (double x, double y) { return x+y; } } 

静态变量通过引用。 您已将operator定义为Operation类型,因此operator.token指的是Operation.token

我建议为此目的使用getter:

 abstract Operation { \\ Basic operation class abstract public double operate (double x, double y); abstract public String getToken(); } class AddOp extends Operation { public double operate (double x, double y) { return x+y; } public String getToken() { return "+"; } }