java子类打印参数默认值而不是指定的值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java子类打印参数默认值而不是指定的值相关的知识,希望对你有一定的参考价值。
我正在做一些阅读和练习,以更好地了解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;
}
这同样适用于声音变量。
你的字段分配是错误的,它应该是
this.numTeeth = numTeeth;
和
this.sound = sound;
否则,您将该字段分配给局部变量,这没有多大意义。
当您分配numTeeth
或sound
时 - 编译器会看到具有相同名称的最接近的局部变量。指定this.sound
时 - 表示您要访问当前对象的字段。所以,当你在做numTeeth = this.numTeeth
时 - 你将你的字段的值赋给局部变量。你必须交换它 - this.numTeeth = numTeeth
- 所以,你要将局部变量(参数)的值赋给字段。
另外,为避免此类错误,您可以使用匈牙利表示法或为字段名称加下划线:
class Test {
int mCount;
//or
int _count;
Test(int count) {
_count = count;
mCount = count;
}
}
以上是关于java子类打印参数默认值而不是指定的值的主要内容,如果未能解决你的问题,请参考以下文章
使用 groovy 中的 list.each 打印最后一个值而不是所有值
Jenkins 远程参数化构建始终使用默认参数值而不是传递的参数值
替换 window.history.replaceState 中的值而不是添加到其中