You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
    }

}

关键说明

  1. 避免变量遮蔽:当你在构造器里写String customerName = Name;时,你创建了一个新的局部变量,它和类的成员变量重名,此时赋值只会修改这个局部变量,类的成员变量依然是初始值"none"。去掉String声明后,赋值操作才会指向类的成员变量。
  2. this关键字的作用:用this.customerName可以明确告诉编译器你要操作的是类的成员变量,即使参数名和成员变量名相同也不会出错,代码可读性更高。
  3. 构造器复用(可选):为了减少重复代码,无参构造器可以调用带参构造器:this("none", "January 1, 2016");,这样所有初始化逻辑都集中在一个构造器里,更易维护。

修复后运行你的ShoppingCartManager,cart1.getCustomerName()就会正确返回"John Doe"了。

内容的提问来源于stack exchange,提问作者Finn Brown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 05:42:45