我正在为一门类(class)编写代码,该类(class)要求用户输入有关员工的数据。我的任务中要求多种员工类型,其中一种是受薪员工,可以获得可选奖金,使其工资增加 10%。
我的问题是,员工的工资没有在我创建的 if block 内按预期更新。顺便说一句,我为奖金创建实例变量的原因是,作为我的类(class)作业的规范,奖金应该在任何时候都可以删除。
下面是 Employee 父类(super class)和 Salaried 子类的构造函数,以及用于实例变量“pay”的 setter
public static class Employee{
double pay;
public void setPay(double p){
pay = p;
}
public double getPay(){
return pay;
}
public Employee(){
}
}
public static class Salaried extends Employee{
private boolean bonus;
public void setBonus(boolean b){
bonus = b;
}
public Salaried(){
super();
System.out.println("What is this employees salary?");
Scanner sc1 = new Scanner(System.in);
double p = sc1.nextDouble();
System.out.println("Give this employee a bonus? Y/N");
if (sc1.nextLine().equalsIgnoreCase("Y")){
setBonus(true);
}
else if (sc1.nextLine().equalsIgnoreCase("N")){
setBonus(false);
}
if (bonus){
setPay(p * 1.1);
}
else{
setPay(p);
}
}
在创建受薪员工并输入例如 10000 作为工资并对有关奖金的问题回答“Y”时,当我尝试使用 getter 检索 pay 实例变量时,我预计会得到 11000,但相反获得 10000,就好像奖金从未应用过一样。我不明白为什么会发生这种情况。
最佳答案
每次调用sc1.nextLine()
时,它都会消耗一行,并且在设置bonus
时调用它两次(第一次,“Y”是已跳过,因为 sc1.nextDouble()
留下尾随新行)。无论如何,您不需要 if
/else
检查来更新 boolean
字段。比如,
public Salaried() {
super();
System.out.println("What is this employees salary?");
Scanner sc1 = new Scanner(System.in);
double p = sc1.nextDouble();
sc1.nextLine(); // <-- consume trailing new line.
System.out.println("Give this employee a bonus? Y/N");
bonus = sc1.nextLine().equalsIgnoreCase("Y"); // <-- just set bonus.
if (bonus) {
setPay(p * 1.1);
} else {
setPay(p);
}
}
关于java - 如何更新 if block 中的实例变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57301400/