【发布时间】:2016-01-03 22:21:15
【问题描述】:
import java.util.Random;
public class Dice {
private int numOfSides;
private int[] sideValues = new int[getNumOfSides()];
public Dice(int numOfSides) {
this.setNumOfSides(numOfSides);
for(int i = 0; i < this.sideValues.length; i++) {
sideValues[i] = i + 1;
}
}
public int Roll() {
return (new Random()).nextInt(getNumOfSides()) + 1;
}
public int getNumOfSides() {
return numOfSides;
}
public void setNumOfSides(int numOfSides) {
this.numOfSides = numOfSides;
}
}
import java.util.Random;
public class CheatDice extends Dice {
public CheatDice(int numOfSides) {
super(numOfSides);
}
public int Roll() {
return 2;
}
}
public class DiceTester {
public static void main(String[] args) {
Dice a = new Dice(6);
System.out.println(a.Roll());
Dice b = new Dice(2120202);
System.out.println(b.Roll());
Dice d = new Dice(5);
System.out.println(d.Roll());
}
}
如何覆盖 Roll() 方法,使其仅打印数字 2?我无法理解覆盖。
编辑:感谢您的回答。有人可以解释为什么您需要一个与父类和子类构造函数具有相同签名的构造函数吗?还是我弄错了?
【问题讨论】:
-
你已经覆盖
Roll()以在你的作弊骰子课程中返回2。我不明白你在问什么。 -
@azurefrog 使用这些行时,它不会将数字 2 打印到控制台: Dice d = new Dice(5); System.out.println(d.Roll());
-
您的问题是,虽然您已经正确定义了
CheatDice,其中Dice中的Roll方法被覆盖,但您还没有创建任何CheatDice实例。顺便说一句,在CheatDice中,您应该在Roll()的声明中添加@Override注释,以便编译器可以在您的覆盖不正确时警告您。此外,Java 中的约定是仅对类型名称(类、枚举)使用大写字母,对方法使用小写字母。 -
@JimGarrison 谢谢
-
有人能解释一下为什么你需要一个与父类和子类构造函数具有相同签名的构造函数吗?还是我弄错了?
标签: java overriding