Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 理解类变量的继承_Java_Variables_Inheritance - Fatal编程技术网

Java 理解类变量的继承

Java 理解类变量的继承,java,variables,inheritance,Java,Variables,Inheritance,我正在用Java构建一个Challenge24Solver类。逻辑本身工作,并找到预期的解决方案(具有任意数量的参数)。不管怎么说,这部分的项目正如我所期望的那样有效 问题来自于解决方案的表示问题。公平地说,我已经用Python完成了这个项目,并决定尝试用Java作为一种介绍,这可能是问题所在,我也在尝试像Python那样做 以下是我的一些课程: abstract class Operation { \\ Basic operation class static String token;

我正在用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);
  }
}
问题是它仍然从操作类中获取令牌:“null”

我理解这可能是因为操作符被声明为操作,但我不理解为什么它不经过标准继承:实例、类、每个超类


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

静态变量通过类引用。您已将
操作符
定义为
操作
类型,因此
操作符.令牌
指的是
操作.令牌

为此,我建议使用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 "+";
  }
}

您不能在基类中使
标记
静态,因为这样所有继承的类都会有一个标记。您需要将其设置为实例变量。您甚至不能将其放在静态方法中,因为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;
    }
}

嘿,我做了一个类Base{x=“s”}类Child扩展Base{x=“x”}和main Base b=new Child();Sysout(b.x)和prints“s”@nachokk提到了同样的原因。变量不会被覆盖。只有方法才被覆盖。感谢您的解释和建议。我可能会使用第二种修复方法。目前,我只是决定定义公共字符串toString()以返回clsName.token,保持token静态。也应该是抽象类操作{}@PrasadKharkar是的,我知道,但我认为它是隐藏的,所以它不能让我清楚隐藏概念,如果我有Child Child=new Child(),sysout(Child.x)x,那么隐藏概念是什么意思?你能更具体一点,在这里问一个新问题吗?我一定会尽力解决您的问题:)。要求你们问一个不同的问题,因为隐藏的概念和这个问题中的问题有点不同