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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:49:05