Java非静态方式跨类获取其他类对象字段的技术咨询
解决Game类访问Demo中创建的Student对象字段的问题
很懂你的困扰——不想用静态破坏对象的唯一性,又需要Game类能访问Demo里创建的player和computer的字段对吧?这里有几个简洁的解决方案,完全贴合你的需求:
方案1:通过构造方法传递Student对象引用
这是最直接的方式,给Game类添加一个接收两个Student对象的构造方法,让每个Game实例持有自己的player和computer引用,保证每个对象的字段都是独立唯一的。
修改后的Game类代码:
package main; import daysOfTheWeek.*; public class Game { private int currentDayOfWeek = 1; private int totalDays = 1; boolean playerHadEvent = false; // 添加成员变量持有两个Student对象 private Student player; private Student computer; // 构造方法接收Student对象 public Game(Student player, Student computer) { this.player = player; this.computer = computer; } public void startGame(){ while(true){ boolean eventDay = false; if(currentDayOfWeek == 5 || currentDayOfWeek == 6){ eventDay = true; } System.out.println("==DAY " + totalDays + ", " + DaysOfTheWeek.getDay(currentDayOfWeek)+"=="); if(eventDay){ String event = Events.getEvent(); if(event.equals("gaming")){ System.out.println("Today there is " + Messages.getGamingEvent()); // 现在可以直接调用player/computer的getter方法获取字段了 if(player.getEnergy() > 30){ // 假设Student有getEnergy()这类getter方法 // 执行你的业务逻辑 } } } totalDays++; currentDayOfWeek++; if(currentDayOfWeek == 8){ currentDayOfWeek = 1; playerHadEvent = false; } } } }
修改后的Demo类代码:
package main; import daysOfTheWeek.*; import dices.*; public class Demo { public static void main(String[] args) { Student player = new Student(); Student computer = new Student(); player.generatePlayer(player); computer.generateComputer(computer); // 创建Game时传入player和computer对象 Game startingGame = new Game(player, computer); startingGame.startGame(); } }
方案2:通过Setter方法传递对象引用
如果不想修改构造方法,也可以给Game类添加setter方法,在创建Game实例后再注入两个Student对象:
Game类新增的setter方法:
public void setPlayer(Student player) { this.player = player; } public void setComputer(Student computer) { this.computer = computer; }
Demo类中的调用方式:
Game startingGame = new Game(); startingGame.setPlayer(player); startingGame.setComputer(computer); startingGame.startGame();
核心思路说明
这两种方案的本质都是让Game类的实例持有Demo中创建的Student对象的引用,既不需要把Student对象或字段设为静态(保证每个对象的字段唯一),又能在Game类的方法中通过这些引用调用Student的getter方法获取字段值。
只要你在Student类中为需要访问的字段编写对应的getter方法(比如public int getEnergy() { return this.energy; }),就可以在Game类里像示例那样直接使用了。
内容的提问来源于stack exchange,提问作者Georgi Michev
相关产品推荐
相关产品推荐

