java子类打印参数默认值而不是指定的值

问题描述 投票:3回答:3

我正在做一些阅读和练习,以更好地了解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());
    }
}
java inheritance
3个回答
3
投票

这段代码:

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

正在执行与您打算执行的操作相反的操作(使用实例字段中的默认值覆盖参数)。它应该是:

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

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

为了防止将来出现这种情况,您可以将输入参数设置为final,这样只会导致原始代码无法编译。

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

这同样适用于声音变量。


4
投票

你的字段分配是错误的,它应该是

this.numTeeth = numTeeth;

this.sound = sound;

否则,您将该字段分配给局部变量,这没有多大意义。


0
投票

当您分配numTeethsound时 - 编译器会看到具有相同名称的最接近的局部变量。指定this.sound时 - 表示您要访问当前对象的字段。所以,当你在做numTeeth = this.numTeeth时 - 你将你的字段的值赋给局部变量。你必须交换它 - this.numTeeth = numTeeth - 所以,你要将局部变量(参数)的值赋给字段。

另外,为避免此类错误,您可以使用匈牙利表示法或为字段名称加下划线:

class Test {
    int mCount;
    //or
    int _count;

    Test(int count) {
        _count = count;
        mCount = count;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.