我是编程的新手,似乎遇到了变量,类等可以并且不能被引用的问题。下面是一个例子,希望你们中的一个可以解决具体问题,但也可以帮助我更广泛地理解它,所以我不会一次又一次地遇到它。
尝试避免发布一堆代码请注意,定义了一个Question类,以及setText,setAnswer,checkAnswer和display方法都在别处定义(全部公开)。
相关代码如下,我有两个问题:
first
无法识别变量presentQuestion()
?checkAnswer()
,也就是为什么我不能只做first.checkAnswer(response);
?为什么我必须在新变量中定义它:boolean outcome = first.checkAnswer(response);
?代码:
/**
* This program shows a simple quiz with two questions.
*/
public class QuestionDemo {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
Question first = new Question();
first.setText("Who was the inventor of Java?");
first.setAnswer("James Gosling");
Question second = new Question();
second.setText("Who was the founder of Udacity?");
second.setAnswer("Sebastian Thrun");
int score = 0;
score = score + presentQuestion(first, in);
// Present the second question
score = score + presentQuestion(second, in);
System.out.println("Your score: " + score);
}
/**
* Presents a question to the user and obtains a response.
* @param q the question to present
* @param in the scanner from which to read the user input
* @return the score (1 if correct, 0 if incorrect);
*/
public static int presentQuestion(Question q, Scanner in) {
// Display the first question
first.display();
System.out.println("Your answer:");
String response = in.nextLine();
// Check whether the response was correct
// If so, print "true" and return 1
// Otherwise, print "false" and return 0
boolean outcome = first.checkAnswer(response);
System.out.println(outcome);
if (outcome) {
return 1;
}
else {
return 0;
}
}
}
答案 0 :(得分:0)
first
是本地变量,这意味着它只能在定义它的方法中访问。checkAnswer()
的结果放入布尔值中。实际上,if (checkAnswer(response)) { ... }
有效。答案 1 :(得分:0)
presentQuestion
将问题作为参数。在main
中,您在第一个问题上调用它,然后在第二个问题上调用它;看起来意图是你在第一个问题上使用presentQuestion
,然后在第二个问题上使用presentQuestion
。到目前为止,非常好。
问题是在q
中,您将问题(可能是第一个或第二个问题)称为参数列表中的q
。您需要做的就是在方法的其余部分使用first
而不是wget --reject jpg,png,css,js,svg,gif --convert-links -e robots=off --content-disposition --timestamping --recursive --domains appbase.io --no-parent --output-file=logfile --limit-rate=200k -w 3 --random-wait docs.appbase.io
。
答案 2 :(得分:0)
您无法在first
中使用变量presentQuestion
的原因是因为它在main
中定义,因此在main
之外不可见}。这不正是你给presentQuestion
Question q
参数的原因吗?
在我看来,这就是你想要做的事情:
public static int presentQuestion(Question q, Scanner in)
{
// Display the first question
q.display();
System.out.println("Your answer:");
String response = in.nextLine();
// Check whether the response was correct
// If so, print "true" and return 1
// Otherwise, print "false" and return 0
boolean outcome = q.checkAnswer(response);
System.out.println(outcome);
if (outcome) {
return 1;
} else {
return 0;
}
}
请注意,对first
的引用已被q
的引用所取代。
为了尝试清除我想象的混淆可能包含的内容,想象一下presentQuestion
是否从main
以外的其他方法调用,在这种情况下,不会声明first
变量所有。那么first
内presentQuestion
的引用会发生什么,现在根本不是指任何东西?这就是您需要显式传递所需数据作为参数的原因。不同的方法是独立的代码块,即使它们碰巧互相调用,也不能在它们之间混合变量引用。
对于问题2,在不使用if(q.checkAnswer(response))
变量的情况下直接检查outcome
确实没有问题。当first
再次被识别时,我猜你只是被编译器发出的错误搞糊涂了。
答案 3 :(得分:0)
当我刚接触编程时,我也有这个问题!然后我发现它非常简单。
对于您的第一个问题,first
方法中声明了main
,您希望在presentQuestion
方法中使用它。但是presentQuestion
和main
是不同的方法!因此,您无法访问first
中的presentQuestion
。如您所见,Question
方法中有一个presentQuestion
类型的参数。这就像你告诉first
,"过来,伙计!然后将您的名字更改为q
。"当您将参数first
传递给presentQuestion
时,
presentQuestion (first, in);
first
来到pressentQuestion
方法,其名称为q
。因此,您应该在q
方法中使用first
而不是presentQuestion
。
现在第二个问题,不需要在此上下文中使用变量。但是为了提高效率,使用布尔变量来存储checkAnswer
的结果。让我们想象如果你不使用布尔变量会发生什么。
System.out.println(q.checkAnswer(response));
if (q.checkAnswer(response)) {
return 1;
} else {
return 0;
}
请参阅?你曾两次打电话给q.checkAnswer
!这会降低你的程序速度,所以你应该使用一个布尔变量。