【问题标题】:How do I access a non static method from main method in the same class? [duplicate]如何从同一类中的主方法访问非静态方法? [复制]
【发布时间】:2021-01-03 00:08:50
【问题描述】:

我正在尝试进行数学测验,但我最近开始学习 Java,但遇到了一些麻烦。我已经阅读了有关访问方法和内容的信息,但我不明白所有这些应该如何帮助我。

    import java.util.Scanner;

public class MatQui{
        Scanner scan = new Scanner(System.in);
    
    int correct = 0;
    
public static void main(String[] args) {
    
    System.out.println("Enter your name: ");
    String name = scan.nextLine();
    
    System.out.println("Hello " + name + "! Answer the questions.");
    
    firstQuiz();
    
}

public void firstQuiz() {
    
    int randomNum1 = (int)(Math.random() * 101 +1);
    int randomNum2 = (int)(Math.random() * 101 +1);
    
    int RandomAddSolution = scan.nextInt();
    int CorrectAddSolution = randomNum1 + randomNum2;
    
    System.out.println(randomNum1 + " + " + randomNum2 + " = ?");
    
    if (RandomAddSolution == CorrectAddSolution) {
        System.out.println("Correct!");
        correct++;
    }
    else if (RandomAddSolution != CorrectAddSolution) {
        System.out.println("Wrong! The correct answer is: " + CorrectAddSolution);
    }
    secondQuiz();
}

public void secondQuiz() {
    
    int randomNum1 = (int)(Math.random() * 101 +1);
    int randomNum2 = (int)(Math.random() * 101 +1);
    
    int RandomMinusSolution = scan.nextInt();
    int CorrectMinusSolution = randomNum1 - randomNum2;
    
    System.out.println(randomNum1 + " - " + randomNum2 + " = ?");
    
    if (RandomMinusSolution == CorrectMinusSolution) {
        System.out.println("Correct!");
        correct++;  //Ly Huong Van
    }
    else if (RandomMinusSolution != CorrectMinusSolution) {
        System.out.println("Wrong! The correct answer is: " + CorrectMinusSolution);
    }
    thirdQuiz();
}

public void thirdQuiz() {
    
    int randomNum1 = (int)(Math.random() * 11 +1);
    int randomNum2 = (int)(Math.random() * 11 +1);
    
    int RandomMulSolution = scan.nextInt();
    int CorrectMulSolution = randomNum1 * randomNum2;
    
    System.out.println(randomNum1 + " + " + randomNum2 + " = ?");
    
    if (RandomMulSolution == CorrectMulSolution) {
        System.out.println("Correct!");
        correct++;
    }
    else if (RandomMulSolution != CorrectMulSolution) {
        System.out.println("Wrong! The correct answer is: " + CorrectMulSolution);
    }
    fourthQuiz();
}

public void fourthQuiz() {
    
    int randomNum1 = (int)(Math.random() * 101 +1);
    int randomNum2 = (int)(Math.random() * 11 +1);
    
    int RandomDivSolution = scan.nextInt();
    int CorrectDivSolution = randomNum1 / randomNum2;
    
    System.out.println(randomNum1 + " / " + randomNum2 + " = ?");
    
    if (RandomDivSolution == CorrectDivSolution) {
        System.out.println("Correct!");
        correct++;
        endingScreen();
    }
    else if (RandomDivSolution != CorrectDivSolution) {
        System.out.println("Wrong! The correct answer is: " + CorrectDivSolution);
        endingScreen();
    }
}

public void endingScreen() {
    int percentageCorrect = correct * 25;
    System.out.println("You answered " + correct + " questions correctly.!\n"
    + "That's "  + percentageCorrect + "%!");
    
    if (correct == 0) {
        System.out.println(":(");
    }
    else if (correct != 0) {
        System.out.println(":)");
    }
}

我想从 main 访问“firstQuiz()”方法,但我收到错误消息,即我无法从静态 main 访问非静态元素。我该如何使用它?

【问题讨论】:

  • 您需要在您的main 中创建此类的实例...该类的名称是什么?
  • 你需要一个类的实例。在main 中你还没有,因为它是static。使用newmain 内部创建一个实例。
  • 您有四个不同的方法,其中包含几乎相同的代码。你真的应该重写它,让它成为一个单一的方法,你可以在其中使用参数来处理方法的变体。
  • 抱歉,我编辑了代码。我一定是错过了我没有复制开头。
  • 你也应该遵守Java命名约定:变量名和方法名应该用驼峰命名。

标签: java


【解决方案1】:

您可能已经注意到,错误表明您无法从静态方法访问非静态方法。对您来说最简单的解决方案是将您正在调用的方法也设为静态。

【讨论】:

  • 但这会让我陷入每个方法都是静态的循环,这并不是我真正想做的事情。
【解决方案2】:

您可以将方法设为静态,或者创建类的新实例并像这样访问它:

Test test = new Test();
test.yourMethod();

【讨论】:

    【解决方案3】:

    可以通过创建方法所在类的对象来访问非静态方法。

    在本例中,您必须在 main 方法中创建类的对象,并使用该对象调用 firstQuiz() 方法。

    【讨论】:

      【解决方案4】:

      正如 tieburach 回答的那样……您无法从静态方法访问非静态方法。您不能更改 main 方法签名,这意味着您不能使 main 非静态。 Main 将始终是静态的。

      解决方案是将您的方法设为静态,但如果它不是您想要的,您也可以在 main 方法中创建另一个类和它的实例,然后在该类上调用方法。

      【讨论】:

        【解决方案5】:

        您需要创建一个新的MatQui matqui = new MatQui(); 并在调用该方法后创建新的对象matqui.firstQuiz();

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-03-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-20
          • 1970-01-01
          相关资源
          最近更新 更多