我正在做一些阅读和练习,以更好地理解 java 继承。当我运行下面的 Lion 类时,它会打印出 0 and null 。我认为它应该打印出参数值,即 30 and roars 。我做错了什么?

public class Animal {

    int numTeeth;

    public Animal(int numTeeth) {
        numTeeth = this.numTeeth;
    }

    public int getNumTeeth() {
        return numTeeth;
    }
    public void setNumTeeth(int numTeeth) {
        this.numTeeth = numTeeth;
    }
}


public class Lion extends Animal {

    String sound;

    public Lion(int numTeeth, String sound)
    {
        super(numTeeth);
        sound = this.sound;
    }

    public String getSound() {
        return sound;
    }

    public void setSound(String sound) {
        this.sound = sound;
    }

    public static void main(String[] args) {

        Lion simba = new Lion(30, "roars");
        System.out.println(simba.getNumTeeth());
        System.out.println(simba.getSound());
    }
}

最佳答案

这段代码:

public Scratch(int numTeeth) {
    numTeeth = this.numTeeth;
}

正在做与您打算做的相反的事情(用实例字段中的默认值覆盖参数)。它应该是:
public Scratch(int numTeeth) {
    this.numTeeth = numTeeth;
}

当局部变量重用实例字段的名称时,如果实例变量名称是静态的,则使用 this 或类名称限定实例变量名称。

为了防止将来发生这种情况,您可以将输入参数设为 final,这只会导致您的原始代码无法编译。
public Scratch(final int numTeeth) {
    this.numTeeth = numTeeth;
}

这同样适用于声音变量。

关于java子类打印参数默认值而不是赋值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49082750/

10-11 20:40
查看更多