public class Occupant {
private Position pos;
public Occupant(Position iniPos) {
this.pos = iniPos;
}
public Position getPosition() {
return pos;
}
public void setPosition(Position newPos) {
this.pos = newPos;
}
public String getStringRepresentation() {
return " ";
}
}
我需要将其子类中的getStringRepresenation覆盖为X,这是我写的内容。
public class Mine extends Occupant {
private Position pos;
public Mine(Position iniPos) {
this.pos = iniPos;
}
public String getStringRepresentation() {
return "X";
}
}
我不知道在哪里使用super和@Override,这个类不会编译。
答案 0 :(得分:2)
在子类Mine
的方法前面,您需要添加@Override
注释。
@Override
public String getStringRepresentation() {
return "X";
}
并且,在子类构造函数中,您必须调用超类构造函数。
public Mine(Position iniPos) {
super(iniPos); // you need to call super class constructor
this.pos = iniPos;
}
答案 1 :(得分:1)
该类不会编译,因为Occupant
有一个带参数的构造函数。所以在Mine
构造函数中,您需要调用超类构造函数。这就是super
关键字在未与方法名称一起使用时的作用。
您不需要使用@Override
注释but it's recommended。
覆盖方法时,您可能希望使用@Override注释来指示编译器您要覆盖超类中的方法。如果由于某种原因,编译器检测到该方法在其中一个超类中不存在,那么它将生成错误。
public class Mine extends Occupant {
public Mine(Position iniPos) {
// call super constructor
super(iniPos);
}
// annotate
@Override
public String getStringRepresentation() {
return "X";
}
}
请注意,Mine
可能不需要另一个Position
,因为超类已经有一个super();
。只需将构造函数参数传递给超类。
必须自己调用构造函数只是Java继承的一个方面。构造函数不是继承的,因此如果超类没有无参数构造函数,则必须显式调用它。如果超类确实有一个无参数构造函数而你没有进行显式的构造函数调用,那么编译器会为你插入一个{{1}}。
答案 2 :(得分:0)
你在意图覆盖的方法上使用@Override
注释只是为了确保在编译时我们真的重写了方法,同时也增加了代码的可读性。
@Override
public String getStringRepresentation() {
}
如果您的方法覆盖了其超类之一的方法,则可以通过使用关键字super
来调用重写方法。
现在您要访问getStringRepresentation
superclass
,super.getStringRepresentation()