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

Java Setter无法更新属性值问题求助

问题原因分析

你遇到的Setter方法失效问题,核心原因是每次调用SouthValley方法时,都会创建一个全新的MainChar实例:

public static void SouthValley(int selectedPath){
    MainChar Stats = new MainChar(); // 每次进入方法都新建对象,之前的修改全部丢失
    // ...
}

当你在case6中修改这个临时实例的defence后,调用startmenu()再次进入SouthValley时,又会创建一个初始状态的新MainChar对象,自然看不到之前的修改结果。

解决方案:共享同一个MainChar实例

让整个菜单流程复用同一个MainChar对象,通过方法参数传递这个实例,避免每次新建。

1. 修改初始启动逻辑(比如main方法)

在程序入口创建唯一的MainChar实例,然后传入菜单方法:

public static void main(String[] args) {
    MainChar playerStats = new MainChar();
    startmenu(playerStats);
}

2. 修改startmenu方法,接收MainChar参数

同时补上缺失的case6选项提示:

public static void startmenu(MainChar stats) { 
    int path;
    Scanner startscan = new Scanner(System.in); 
    System.out.println("-----------------------");
    System.out.println("Enter Shop : 1"); 
    System.out.println("Enter house : 2"); 
    System.out.println("Enter town square : 3"); 
    System.out.println("Leave town : 4"); 
    System.out.println("Check stats : 5"); 
    System.out.println("Update defence : 6"); // 补上case6的选项提示
    System.out.println("Chosen path: "); 
    path = startscan.nextInt(); 
    SouthValley(path, stats); 
}

3. 修改SouthValley方法,移除内部新建实例的代码

改为接收外部传入的MainChar实例:

public static void SouthValley(int selectedPath, MainChar stats){
    do {
        switch(selectedPath){
            case 1: 
                System.out.println("You Entered shop");
                System.out.println("-----------------------------");
                break;
            case 2: 
                System.out.println("You Entered your house"); // 修正拼写错误
                break;
            case 3: 
                System.out.println("You Entered Town Square");
                break;
            case 4:
                System.out.println("You left the town");
                FirstPath(stats); // 如果FirstPath需要访问属性,同样传递参数
                break;
            case 5:
                System.out.println("--------------------------------");
                System.out.println("Defence: " + stats.getDefence());
                System.out.println("Strength: " + stats.getStrength());
                System.out.println("Mana: " + stats.getMana());
                System.out.println("Health: " + stats.gethealth());
                startmenu(stats);
                break;
            case 6:
                stats.setDefence(50);
                System.out.println("Defence updated to: " + stats.getDefence());
                startmenu(stats);
                break;
            default:
                System.out.println("Invalid path, please try again.");
                startmenu(stats);
                break;
        }
    }
    while(selectedPath < 7);
}

4. (可选)调整FirstPath方法

如果FirstPath也需要访问玩家属性,同样需要接收MainChar参数,保持实例一致。

原理说明

现在整个菜单流程中使用的是同一个MainChar实例,所有的setter修改都会直接作用在这个实例上,下次通过getter查询时,就能获取到更新后的值。

内容的提问来源于stack exchange,提问作者Isak Lockman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 11:25:36