【问题标题】:Using a method from a class without creating object (non-static) [duplicate]使用类中的方法而不创建对象(非静态)[重复]
【发布时间】:2018-12-19 14:51:01
【问题描述】:

我有 3 个类,MainEnemyUserCharacterEnemy 包含敌人的属性和可能的​​动作。 UserCharacter 包含用户的属性和可能的​​操作。 Main 管理逻辑并从 EnemyUserCharacter 类创建对象。

我正在尝试使用 Enemy 类中包含的 setter 方法,该方法来自 UserCharacter

类中的方法
public class UserCharacter {

    private String userName = "Adventurer";
    private int userAttack = 5;
    private int userLife = 100;

    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }

    public int getUserLife() {
        return userLife;
    }
    public void setUserLife(int userLife) {
        this.userLife = userLife;
    }


    public void Attack() {          
        Enemy.setEnemyLife(10);                 
    }    
}

有没有办法在不将方法设置为静态的情况下这样做? (除了创建一个不是选项的类对象,因为它是在 Main 中完成的) 是否建议使用静态 setter 方法? (我想我必须为 setter 创建一个虚拟静态变量)

谢谢

【问题讨论】:

  • 在继续之前,请确保您了解静态变量和实例变量之间的区别。 stackoverflow.com/questions/21204589/…
  • 你想达到什么目的?
  • "Main 管理逻辑并从 Enemy 和 UserCharacter 类创建对象" 。是吗?
  • 作为社区 wiki 回答,因为我认为这个问题有很多重复项
  • 请查看编辑回答

标签: java class methods setter


【解决方案1】:

您在问XY Problem,您在哪里以错误的方式查看问题。问题不在于您想在不创建实例的情况下调用 setter,而是您想要做的是在 正确 实例上调用 setter,这意味着

  1. 不,你不想在没有实例的情况下调用实例方法——恐怕这根本没有意义
  2. 是的,你是对的,将 setter 设为静态无济于事,因为这样每个 Enemy 将共享相同的状态 - 不好。
  3. 不,你不想创建一个“虚拟”实例(改变你不使用的东西的状态有什么好处?)
  4. 确实需要将正确的 Enemy 实例的引用传递到需要调用该方法的位置,然后在该实例上调用该方法。了解正在发生的事情的关键在于,角色不仅仅是在与任何敌人作战,而是在与特定敌人作战,这是由你的游戏决定的,你需要在攻击/战斗发生时更改该角色和特定敌人的状态。因此,改变虚拟敌人或所有敌人(通过静态)的状态是没有意义的。它必须是那个特定的敌人对象,这就是为什么你需要在需要的地方引用那个对象,并在那个对象上调用方法。

在此设置中,我将创建一个 Game 或 World 类来处理敌人和角色之间的交互和冲突。当一个角色攻击一个敌人时,它会告诉这个 World 类它正在这样做,以及哪个敌人,然后 World 对象决定从角色和敌人身上增加或减少什么点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-04
    • 2021-09-25
    • 2015-10-07
    • 2015-04-28
    • 1970-01-01
    • 2015-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多