了解类变量的继承

时间:2013-06-17 02:00:07

标签: java variables 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,但我不明白它为什么不通过标准继承:instance,class,each superclass

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

2 个答案:

答案 0 :(得分:3)

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

我建议为此目的使用吸气剂:

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 "+";
  }
}

答案 1 :(得分:3)

您不能在基类中使token为静态,因为每个所有继承的类都会有一个令牌。您需要将其设为实例变量。您甚至无法将其置于静态方法中,因为Java中的static方法不可覆盖。

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

要解决此问题,请在基础中创建token 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;
    }
}