重要的是要注意,一旦您覆盖了一个方法,您基本上会忽略父类中的所有内容,而是在子类中拥有您自己的自定义实现(实际上是覆盖它)!
在我们的例子中,我们不想丢弃父实现。我们实际上想继续使用原来的方法,并为每个子类单独添加额外的检查。
这就是我们使用“super”关键字的地方!
您可以通过使用“super”关键字,后跟一个点,然后是方法名称来重用子类中的父方法:
例如:isValidMove(position) 是棋子的方法并检查移动有效性并在 8x8 棋盘中绑定。
super.isValidMove(位置);
在这里使用关键字 super 意味着我们要从“this”类的实现内部运行超级(或父)类中的实际方法。
这意味着在每个子类中,在您检查自定义移动之前,您可以检查 super.isValidMove(position) 是否返回 false。如果是,则无需进行任何检查并立即返回 false;否则,继续检查。
Rook 类的新实现如下所示:
class Rook extends Piece{
boolean isValidMove(Position newPosition){
// First call the parent's method to check for the board bounds
if(!super.isValidMove(position)){
return false;
}
// If we passed the first test then check for the specific rock movement
if(newPosition.column == this.column && newPosition.row == this.row){
return true;
}
else{
return false;
}
}
}
您还可以使用 super() 调用父级的构造函数。这通常在实现子构造函数时完成。通常,您希望首先在父构造函数中运行所有内容,然后在子构造函数中添加更多代码:
class Rook extends Piece{
// default constructor
public Rook(){
super(); // this will call the parent's constructor
this.name = "rook";
}
}
注意:如果子构造函数没有使用 super 显式调用父构造函数,Java 编译器会自动插入对父类的默认构造函数的调用。如果父类没有默认构造函数,你会得到一个编译时错误。