初学者Java范围问题

时间:2015-08-09 00:03:06

标签: java scope

我是编程的新手,似乎遇到了变量,类等可以并且不能被引用的问题。下面是一个例子,希望你们中的一个可以解决具体问题,但也可以帮助我更广泛地理解它,所以我不会一次又一次地遇到它。

尝试避免发布一堆代码请注意,定义了一个Question类,以及setText,setAnswer,checkAnswer和display方法都在别处定义(全部公开)。

相关代码如下,我有两个问题:

  1. 为什么方法first无法识别变量presentQuestion()
  2. 最后,为什么我不能先调用方法checkAnswer(),也就是为什么我不能只做first.checkAnswer(response);?为什么我必须在新变量中定义它:boolean outcome = first.checkAnswer(response);
  3. 代码:

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

4 个答案:

答案 0 :(得分:0)

  1. first本地变量,这意味着它只能在定义它的方法中访问。
  2. 在使用之前,您不必将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变量所有。那么firstpresentQuestion的引用会发生什么,现在根本不是指任何东西?这就是您需要显式传递所需数据作为参数的原因。不同的方法是独立的代码块,即使它们碰巧互相调用,也不能在它们之间混合变量引用。

对于问题2,在不使用if(q.checkAnswer(response))变量的情况下直接检查outcome确实没有问题。当first再次被识别时,我猜你只是被编译器发出的错误搞糊涂了。

答案 3 :(得分:0)

当我刚接触编程时,我也有这个问题!然后我发现它非常简单。

对于您的第一个问题,first方法中声明了main,您希望在presentQuestion方法中使用它。但是presentQuestionmain是不同的方法!因此,您无法访问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 !这会降低你的程序速度,所以你应该使用一个布尔变量。