Java 理解类变量的继承
我正在用Java构建一个Java 理解类变量的继承,java,variables,inheritance,Java,Variables,Inheritance,我正在用Java构建一个Challenge24Solver类。逻辑本身工作,并找到预期的解决方案(具有任意数量的参数)。不管怎么说,这部分的项目正如我所期望的那样有效 问题来自于解决方案的表示问题。公平地说,我已经用Python完成了这个项目,并决定尝试用Java作为一种介绍,这可能是问题所在,我也在尝试像Python那样做 以下是我的一些课程: abstract class Operation { \\ Basic operation class static String token;
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,那么隐藏概念是什么意思?你能更具体一点,在这里问一个新问题吗?我一定会尽力解决您的问题:)。要求你们问一个不同的问题,因为隐藏的概念和这个问题中的问题有点不同