当前位置: 首页 > 知识库问答 >
问题:

为什么我的两个变量的比较if语句行不通?[副本]

楚宏胜
2023-03-14

在下面的代码中,一旦执行,它将根据随机数生成器更改对象diet的状态hek。我还有一个undo()函数,它在运行时工作得非常好。

我要做的是:当对象的状态发生更改,但以前的状态prevdiet等于更改后的状态currentdiet时,我希望程序调用undo()

import java.util.Random;
import javax.swing.JOptionPane;

public class changeDietCom implements Command {

    Hek hek;
    Random rand = new Random();
    int x;
    DietBehaviour prevDiet;
    DietBehaviour currentDiet;

    public changeDietCom(Hek hek) {
        this.hek = hek;
    }

    public void execute() {

        x = rand.nextInt(3) + 1;

        prevDiet = hek.getDietBehaviour();
        if (x == 1) {

            hek.setDietBehaviour(new Enemies());
            JOptionPane.showMessageDialog(null, "Hek's diet has been changed!", "Changing diet", JOptionPane.INFORMATION_MESSAGE);

            currentDiet = hek.getDietBehaviour();
            hek.performDiet();

            if (prevDiet == currentDiet) {
                JOptionPane.showMessageDialog(null, "Diet hasn't changed!", "Current Diet = Prev Diet", JOptionPane.INFORMATION_MESSAGE);
                undo();
            }
        }
        else if (x == 2) {

            hek.setDietBehaviour(new ArmouredKnights());
            JOptionPane.showMessageDialog(null, "Hek's diet has been changed!", "Changing diet", JOptionPane.INFORMATION_MESSAGE);

            currentDiet = hek.getDietBehaviour();
            hek.performDiet();

            if (prevDiet == currentDiet) {
                JOptionPane.showMessageDialog(null, "Diet hasn't changed!", "Current Diet = Prev Diet", JOptionPane.INFORMATION_MESSAGE);
                undo();
            }
        }
        else if (x == 3) {

            hek.setDietBehaviour(new BigMac());
            JOptionPane.showMessageDialog(null, "Hek's diet has been changed!", "Changing diet", JOptionPane.INFORMATION_MESSAGE);

            currentDiet = hek.getDietBehaviour();
            hek.performDiet();

            if (prevDiet == currentDiet) {
                JOptionPane.showMessageDialog(null, "Diet hasn't changed!", "Current Diet = Prev Diet", JOptionPane.INFORMATION_MESSAGE);
                undo();
            }
        }
    }

    public void undo() {
        JOptionPane.showMessageDialog(null, "Undoing diet change...", "Undoing Diet Change", JOptionPane.INFORMATION_MESSAGE);
        hek.setDietBehaviour(prevDiet);
        hek.performDiet();
    }
}

但是,只要在运行时上一个状态prevdiet和当前状态currentdiet彼此相等,if语句就不会返回true,我看不出为什么不返回?谁能告诉我为什么和如何解决这个问题吗?

我应该提到的是,我正在使用命令模式来设计程序的这一部分。

共有1个答案

谢弘阔
2023-03-14

使用if(prevDiet==currentDiet){,可以比较对象引用而不是实际值。请使用if(prevDiet.equals(currentDiet)){,并确保重写dietBehavioryequals()方法。

请注意,当重写equals()时,还应该重写hashcode(),并且实现应该是一致的。有关这方面的更多信息可以在这里找到。

 类似资料:
  • 我试着比较两个值 我得到一个错误

  • 首先,我发现了另外两条有类似问题的线索。问题在于,他们没有为字符串使用正确的等号,也没有为他们的特定问题正确设置if语句的格式。 在我的任务中,我需要创建一个名为“猪”的游戏,玩家与计算机对决,在掷骰子时先获得100分。如果玩家在一个回合中掷1,他们不会得到额外的分数。如果玩家掷两个1,那么他们将失去所有分数。我还没有对电脑的回合进行编码,只是专注于玩家。请告诉我我做错了什么。提前非常感谢。 我的

  • 我正在经历一些奇怪的行为,我认为与范围有关,但我不能解释为什么会发生。 但我不明白为什么前面的例子不起作用。我已经读过关于范围的文章,如果在更高的级别上定义了这个变量,应该可以重新分配给它。即使我在函数外定义了isDash,它仍然不起作用。它的值总是保持初始值:false。为什么if语句不将其值更改为true? 正如您所看到的,如果我编写类似的东西来演示是否可以在嵌套的if语句中使用变量,它可以正

  • 我是java编程新手,很难弄清楚这一点。 这是我的代码: 有没有办法将其转换为switch-case语句?

  • 问题内容: 以下Java代码无法编译。 为什么?在没有先声明的情况下,没有代码路径可导致程序将1分配给该路径。 我想到的范围可能仅限于第一条陈述,但后来我不明白为什么。如果我真的不想不必要地声明以提高性能怎么办?我不喜欢声明后不使用变量。 (您可能想争论一下,我不可以在第二条语句中简单地声明b ,在这种情况下,请想象一下它可能在其他地方处于循环中。) 问题答案: 为什么?如果没有先声明,没有代码路

  • 好吧,我正在使用字典,例如: 然后我想做的基本上是说,如果“用户”(一个参数)的名称前面有“@”,那么将变量前缀分配为“@”,如果他们的名称前面有“~”,则将变量前缀分配为“~”,如果他们有“ 然后我想说,如果用户的名字前面有“%”,则将前缀变量设置为“%”,否则将其设置为“”(因为这些值只有两个键)。为此,我需要一个if语句,并将其与self进行比较。声音的价值。 分配前缀变量的当前代码 目前,