2016-10-02 43 views
-4

昨天我问了this有关while循环没有结束的问题,并被告知我需要在使用setter的主要方法内设置“correct”为true。我对制定者和获得者进行了一些研究,并且我完全迷失了。他们究竟做了什么以及如何在这种情况下使用它们?Java循环需要setter

编辑:谢谢本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; 
     } 
    } 
+0

getter和setter方法访问正确的变量在每半个小时解释体面的教程,你不知道他们是什么借口? – Kayaman

+0

Getters和setter是类的变量的访问器和变体。这些对于OOP(封装)是非常标准的。 –

+0

那么@Kayaman我的“借口”是我不明白。就像我上面所说的,我尝试了解它们,但我不明白。对于你来说太疯狂了,因为有人可能会遇到麻烦。 – KobiF

回答

1

好吧,OOP 101,道歉,如果你已经知道这个东西,但它似乎像一个回到基本的方法可能有帮助。在Java中,与大多数面向对象编程一样,您主要参与处理由'classes'定义的'objects'。对象是程序中特定类型的“事物”的实例,它们具有“方法”(他们所做的事)和“属性”。

如果我们考虑汽车的情况。一辆特定的汽车可能是红色的,或黄色的;它也可能有三到五个门。这些属性。同样的,汽车也可以做事情,比如开车。至关重要的是,我们不需要知道汽车是如何工作的,我们只需踩下踏板即可。我们的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 

    ... 
} 

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

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

这就是我们的主要观点。如果最初,我们只能通过一种方法获得我们的速度,这个问题就不会出现。我们可以通过几种方法做到这一点:

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

class Car { 

    ... 

    private int speed; 

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

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

    ... 
} 

编辑

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

  • 创建一个私人correct财产Question类;至少创建一个getter如上图所示
  • 在主类,那么你可以访问此吸气的questionsObject,而不是在while循环条件
+0

谢谢你这个非常详细的解释!我还有一个问题。因此,在设置getter和setter方法之后,如何更改或使用不同类中的方法? @Ben Wainwright – KobiF

+0

@KobiF我补充了一点点。现在我的帖子里有足够多的东西来解决......:P –

0

在我看来,像你在Java中,特别是OO在这一些基本面缺乏了解案例范围,这很好,我们都在那里。

我推荐通过这篇写得很好的文章Jon Skeet。这将向您解释通过价值或参考传递的差异。

In(very)short;当你通过价值传递时,你无法改变该值超出其范围的状态。

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

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