昨天我问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;
}
}
答案 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