Java 循环需要 setter

Java loop needs setter

昨天我问了 this 关于 while 循环没有结束的问题,被告知我需要在我的主要方法中使用 setter 将 "correct" 设置为 true。我对 setters 和吸气剂做了一些研究,但我完全迷路了。它们究竟是做什么的,在这种情况下我该如何使用它们?

编辑:谢谢 Ben Wainwright 的回答!

主要方法:

while (lives > 0 && correct == false) {
    startTime = System.currentTimeMillis();
    timeObject.time2();
    levelinfoObject.levelInfo(currentlevel);
    timeObject.time1();
    levelinfoObject.livesInfo(lives);
    timeObject.time1();
    levelinfoObject.skipsInfo(skips);
    timeObject.time2();
    questionsObject.questionOne(lives, correct, choice, skips, currentlevel)        
}

问题中的一种方法class:

    public void questionOne(int lives, boolean correct, String choice, int skips, int currentlevel) {

    Scanner scanner = new Scanner(System.in);

    System.out.println(" ");
    System.out.println("Question: If there are 6 apples in a tree and you take 4, how many do you have?");

    timeObject.time2();

    System.out.println("A: 3");
    System.out.println("B: 4");
    System.out.println("C: 2");
    System.out.println("D: 6");

    while (correct == false && lives > 0) {

        choice = scanner.nextLine();

        switch(choice) {
        case "a":
            System.out.println("WRONG! Try again.");
            lives = lives - 1;
            break;
        case "b":
            System.out.println("CORRECT! You have the 4 you took obviously.");
            correct = true;
            break;
        case "c":
            System.out.println("WRONG! Try again.");
            lives = lives - 1;
            break;
        case "d":
            System.out.println("WRONG! Try again.");
            lives = lives - 1;
            break;
        case "skip":
            if (skips > 0) {
                System.out.println("You have skipped level " + currentlevel + "!");
                skips = skips - 1;
                correct = true;
            }

            else {
                System.err.println("You do not have any skips left!");
            }
            break;
        default:
            System.err.println("Please type an answer.");
            break;
        }
    }

在我看来,您对 Java 中的一些基础知识了解甚少,特别是 OO,在这种情况下是范围,这很好,我们都去过那里。

我建议阅读 Jon Skeet 这篇写得很好的文章。这将向您解释按值传递或引用传递的区别。

(非常)简短;当您按值传递时,您不能在其自身范围之外更改该值的状态。

这解释了为什么您的主体不响应方法中所做的任何变量值更改,仅仅是因为它们实际上并未被修改,您只是将它们发送到新的范围。

至于封装:访问修饰符,getters和setters..我推荐以下教程:Java Encapsulation

好的,OOP 101,抱歉,如果您已经知道这些内容,但回归基础方法似乎可能会有帮助。

在 Java 中,与大多数面向对象编程一样,您主要涉及处理由 'classes' 定义的 'objects'。对象是程序中特定类型 'thing' 的实例,它具有 'methods'(它们所做的事情)和 'properties'.

如果我们考虑汽车的情况。特定的汽车可能是红色或黄色;它也可能有三或五扇门。这些是属性。同样,汽车可以做一些事情,比如开车。至关重要的是,我们不需要知道汽车是如何驱动它的,我们只需要踩下踏板。我们的 Java 对象也是如此;我们并不真正关心内部工作原理,我们所要做的就是调用 drive() 方法。下面,创建一个'car' 对象,给定颜色,然后调用'drive'方法。

Car c = new Car();
car.colour = Car.Colour.RED;
car.drive();

A 'class' 描述了汽车是什么样的(它的属性)和它能做什么(它的方法)。思考汽车类比;您可能会认为 class 类似于汽车的 'factory blueprint'。

class Car {

   public enum Colour {
      RED,
      GREEN,
      ORANGE,
      RAINBOW_COLOURED
   }

   public Colour colour;
   public int speed;

   public void drive() 
   {
      // ... some code that implements driving
   }
}

所以你可以在这里看到我添加了一些属性,它们的值都可以从外部更改。这一切都很好,很好;也许我们想让我们的车更快,所以我们可以通过

来改变它
car.speed = 10000000000;

太棒了;现在我们有一辆超快的车。但是如果我们想做一些更复杂的事情呢?我们用代码表示我们汽车的发动机怎么样,我们汽车的速度取决于发动机的功率。

class Car {

   ...

   public int speed() {

      // This is an arbitrary operation for the sake of me not
      // having to learn how engines work. Ahem.

      return engine.power() * 842; 
   }

   public Engine engine; // Assume this class is defined elsewhere

   ...
}

太棒了!现在更酷了,除了...

哎呀,上面试图设置汽车速度的线现在坏了。

这就把我们带到了我们的重点。如果最初,我们只通过一种方法访问我们的速度,就不会出现这个问题。我们可以通过几种方式做到这一点:

请注意,所有内容前面似乎都有关键字 public。这意味着 'this property/method 可以从对象外部访问。所以首先,我们将所有属性更改为 private 访问,然后提供一对方法来访问它们。这些方法称为 'setters' 和 'getters'。见下文

class Car {

   ...

   private int speed;

   public int getSpeed() // The getter
   {
      return speed;
   }

   public void setSpeed(int newSpeed) // The setter
   {
      speed = newSpeed;
   }

   ...
}

编辑

我不会给你解决问题的确切代码,因为你不会学到任何东西。但大致你需要做的是:

  • 在您的 Question class 上创建私人 correct 属性;至少创建一个 getter 如上所示
  • 在你的主 class 中,你可以在 questionsObject 上访问这个 getter 而不是在 while 循环条件 [=53= 中访问正确的变量]