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
相关产品推荐
相关产品推荐

