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= 中访问正确的变量]
昨天我问了 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= 中访问正确的变量]