Java类参数无法通过构造器传递问题求助
问题解决:ShoppingCart构造器无法更新成员变量
你的核心问题是变量遮蔽——在构造器内部重新声明了和类成员变量同名的局部变量,导致赋值操作只作用于局部变量,完全没修改到类的私有成员变量。
修复方案
把构造器里的局部变量声明去掉,直接给类的成员变量赋值(可以用this.明确指向成员变量,避免混淆),同时优化参数命名符合Java规范:
import java.util.ArrayList; public class ShoppingCart { private String customerName = "none"; private String currentDate = "January 1, 2016"; //ArrayList<ItemToPurchase> cartItems = new ArrayList<ItemToPurchase>(); // 带两个参数的构造器 ShoppingCart(String name, String date) { this.customerName = name; this.currentDate = date; } // 无参构造器:成员变量已经有默认值,无需重复声明 ShoppingCart() { // 可选:用 this("none", "January 1, 2016"); 复用带参构造器,减少重复代码 } // 带单个参数的构造器 ShoppingCart(String name) { this.customerName = name; // 如需保留默认日期,无需修改currentDate } // Getter methods public String getCustomerName(){ return customerName; } public String getDate() { return currentDate; } }
关键说明
- 避免变量遮蔽:当你在构造器里写
String customerName = Name;时,你创建了一个新的局部变量,它和类的成员变量重名,此时赋值只会修改这个局部变量,类的成员变量依然是初始值"none"。去掉String声明后,赋值操作才会指向类的成员变量。 this关键字的作用:用this.customerName可以明确告诉编译器你要操作的是类的成员变量,即使参数名和成员变量名相同也不会出错,代码可读性更高。- 构造器复用(可选):为了减少重复代码,无参构造器可以调用带参构造器:
this("none", "January 1, 2016");,这样所有初始化逻辑都集中在一个构造器里,更易维护。
修复后运行你的ShoppingCartManager,cart1.getCustomerName()就会正确返回"John Doe"了。
内容的提问来源于stack exchange,提问作者Finn Brown
相关产品推荐
相关产品推荐

