Java循环需要setter

时间:2016-10-02 15:19:06

标签: java while-loop setter

昨天我问this关于while循环没有结束的问题,并被告知我需要设置"更正"使用setter在我的main方法中使用true。我做了一些关于制定者和吸气剂的研究,我完全迷失了。他们究竟做了什么以及如何在这种情况下使用它?

编辑:谢谢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)        
}

质疑问题类中的一种方法:

    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;
        }
    }

2 个答案:

答案 0 :(得分:1)

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

在Java中,与大多数面向对象编程一样,您主要涉及处理由“类”定义的“对象”。对象是程序中特定类型的“事物”的实例,它具有“方法”(他们所做的事情)和“属性”。

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

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

'class'描述汽车是什么样的(它的属性)以及它可以做什么(它的方法)。关于汽车比喻的思考;您可能会认为该课程就像汽车的“工厂蓝图”。

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

   ...
}

GREAT!除了......之外,现在更酷了。

哎呀,上面试图设定汽车速度的线路现在已经坏了。

这就把我们带到了我们的主要观点。如果最初,我们只通过一种方法访问我们的速度,这个问题不会出现。我们可以通过以下两种方式实现这一目标:

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

class Car {

   ...

   private int speed;

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

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

   ...
}

修改

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

  • correct课程中创建私有Question媒体资源;至少创建一个如上所示的吸气剂
  • 在您的主课程中,您可以在questionsObject上访问此getter,而不是在while循环条件中访问正确的变量

答案 1 :(得分:0)

在我看来,你对Java中的一些基本原理,特别是OO以及在这种情况下的范围很难理解,这很好,我们都去过那里。

我建议Jon Skeet阅读这篇写得很好的文章。这将向您解释通过值或参考的差异。

(非常)短;当您通过值传递时,您无法在其自己的范围之外更改该值的状态。

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

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