【问题标题】:Why won't variabes from other methods return to the main method? (more inside)为什么其他方法的变量不会返回到主方法? (更多内部)
【发布时间】:2015-12-09 22:09:53
【问题描述】:

这个程序的目的是打印 解的数量和二次函数的解, 由用户输入。

这里的问题是我得到了私有变量的错误, 为什么是这样?同样对于我的构造函数,它指出我的变量无法解析,即使 它们是在 main 方法中建立的。最后我的变量会传给main方法或者“toString”方法使用 在 main 方法中。

这是一个学校作业,我的教授要求我使用“toString”方法以及私有变量。对于任何格式错误和大问题,我提前道歉,因为我是新手 到这个网站。

import java.util.Scanner

public class QuadraticSolver
{
    private static Scanner in;

    public static void main(String[]args)
    {   
        QuadraticSolver qs = new QuadraticSolver();
        in = new Scanner(System.in);
        private double a;
        private double b;
        private double c;

        System.out.println("Enter coefficients for quadratic function. ");
        a = in.nextDouble();
        b = in.nextDouble();
        c = in.nextDouble();

        qs.getRoot1(a,b,c);
        qs.getRoot2(a,b,c);
        qs.numOfSolutions(a,b,c);

        System.out.println("Your quadratic function is " + a + "x^2 + " + b + "x + " + c);
        System.out.println(qs.toString());
    }

    public QuadraticSolver()
    {
        a = 0;
        b = 0;
        c = 0;
    }

    public double getRoot1(double a,double b,double c)
    {
        private double root1;   

        root1 = (-b + Math.sqrt(Math.pow(b,2) - 4*a*c)) / (2*a);
        return root1;
    }

    public double getRoot2(double a,double b,double c)
    {   
        private double root2;

        root2 = (-b + Math.sqrt(Math.pow(b,2) - 4*a*c)) / (2*a);
        return root2;
    }

    public int numOfSolutions(double a,double b,double c)
    {
        private int sol = 0;
        private double d;

        d = Math.pow(b,2) - 4*a*c;

        if(d > 0)
        {
            sol = 2;
        }
        else if(d == 0)
        {
            sol = 1;
        }
        else if(d < 0)
        {   
            sol = 0;
        }

        return sol;
    }

    public String toString() 
    {
        return "There are(is) " + sol + " solution(s). x = " + root1 + " x = " + root2;
    }
}

【问题讨论】:

  • getRoot1getRoot2 返回不同的值可能是个好主意。
  • 这不会产生编译错误吗?如果是这样,请显示您收到的错误消息。
  • 线程“main”java.lang.Error 中的异常:未解决的编译问题:a 无法解析为变量 b 无法解析为变量 c 无法解析为变量 sol 无法解析为变量 root1 无法解析为变量 root2 无法解析为 QuadraticSolver 处的变量。(QuadraticSolver.java:44) 在 QuadraticSolver.main(QuadraticSolver.java:23)
  • 安德鲁:这个信息太重要了,不能被埋没在 cmets 中。我建议您将上面发布的信息通过editing the question 放入您的主要问题中,并指出哪一行是第 23 行。此外,对于以后的问题,请始终告诉我们任何和所有编译错误或异常,发布您的问题的完整信息。忽略它太重要了。
  • 我错了,谢谢。

标签: java oop scope quadratic


【解决方案1】:

您应该将变量移动到类级别:

public class QuadraticSolver {

    private double a;
    private double b;
    private double c;

    ...

}

接下来,需要访问属于对象qs的变量:

    public static void main(String[]args)
    {   
        QuadraticSolver qs = new QuadraticSolver();
        in = new Scanner(System.in);

        System.out.println("Enter coefficients for quadratic function. ");
        qs.a = in.nextDouble();
        qs.b = in.nextDouble();
        qs.c = in.nextDouble();

        ...
    }

最后,您应该从方法getRoot1() 等中删除变量。这是因为每个方法都可以访问属于对象本身的变量abc。因此:

    public double getRoot1()
    {
        double root1 = (-b + Math.sqrt(Math.pow(b,2) - 4*a*c)) / (2*a);
        return root1;
    }

在通话地点:

    public static void main(String[]args)
    {
        ...
        double root1 = qs.getRoot1();
        double root2 = qs.getRoot2();
        int numsol = qs.numOfSolutions();
        ...
    }

【讨论】:

    【解决方案2】:

    私有实例变量属于一个类。当您创建一个作为类的实例的对象时,该对象可能具有属于该对象的实例变量;如果您创建一个类的多个实例,则每个实例(对象)都有自己的一组实例变量。你在类中声明它们:

    public class QuadraticSolver
    {
        private static Scanner in;
        private double a;  // instance variables
        private double b;
        private double c;
    

    现在,要访问这些变量,您需要有一个对象。如果您在类内的非静态方法中,或在类的构造函数中,则该方法将使用名为this 的对象,因此您可以说this.a 或只是a 得到那个多变的。如果你在类之外,或者在类中的 static 方法中(包括main),你需要告诉它你正在使用什么对象。在您的程序中,您的main 方法有一个对象qs,它是一个QuadraticSolver,您可以通过说qs.aqs.b 等来获取该对象的实例变量。

    在方法中声明的变量是本地变量。它们仅用于该方法中。他们不为对象声明实例变量。您不能在它们上使用关键字private,因为该关键字仅适用于实例变量(以及其他非变量)。您不能在该方法之外使用变量。如果您在一组内部花括号中声明它们,则不能在花括号之外使用它们。如果您声明一个与实例变量同名的局部变量,则两者之间没有任何联系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 2014-11-29
      • 2012-10-04
      • 2019-02-27
      • 1970-01-01
      • 2019-09-07
      • 1970-01-01
      相关资源
      最近更新 更多