Java方法重载问题:带参构造器赋值异常导致返回值错误求助
解决Java带参构造器参数传递失效的问题
嘿,我一眼就发现你代码里的问题啦!你的DebugBox带参构造器里犯了一个新手常遇到的变量名冲突错误,导致参数根本没赋值给类的成员变量。
问题根源
在带参构造器里,你写的是:
public DebugBox(int width, int length, int height) { width = width; length = length; height = height; getVolume(); }
这里的width、length、height既是构造器的参数(局部变量),也是类的成员变量。Java里局部变量的优先级高于成员变量,所以width = width其实是把参数的值赋值给它自己,完全没碰类的成员变量!而类的成员变量默认初始值是0,所以最后输出的长宽高和体积都是0。
反观你的无参构造器,直接给成员变量赋值,没有重名问题,所以能正常工作:
public DebugBox() { length = 1; width = 1; height = 1; }
修复方案
有两种简单的修复方式:
方式1:使用this关键字区分成员变量和参数
this代表当前对象的引用,用它来明确指定要赋值的是类的成员变量:
public DebugBox(int width, int length, int height) { this.width = width; this.length = length; this.height = height; // 这里调用getVolume()其实没必要,因为showVolume方法会主动调用它计算 }
方式2:修改参数名,避免重名
比如给参数加个前缀,比如w、l、h,这样就不会和成员变量混淆了:
public DebugBox(int w, int l, int h) { width = w; length = l; height = h; }
额外小建议
你在带参构造器里调用getVolume()其实没什么作用,因为这个方法只是计算并返回体积,你既没接收返回值也没做其他操作,完全可以删掉这行代码。当showVolume方法调用aBox.getVolume()时,会实时计算当前对象的体积,这样更合理。
修复后再运行代码,box2的长宽高就会是你传入的12、10、8,体积也会正确计算为960啦!
内容的提问来源于stack exchange,提问作者Rick Cox
相关产品推荐
相关产品推荐

