为什么其他方法的变量不会返回主方法? (更多内部)

时间:2015-09-14 00:19:19

标签: java oop scope quadratic

该程序的目的是打印 解决方案的数量和二次函数的解决方案, 由用户输入。

这里的问题是我因私有变量而出错, 为什么是这样?同样对于我的构造函数,它声明即使我的变量也无法解析 它们是在主要方法中建立的。最后,我的变量将传递给main方法或“toString”方法以供使用 在主要方法中。

这是针对学校作业的,我的教授要求我使用“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;
    }
}

2 个答案:

答案 0 :(得分:2)

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

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();
        ...
    }

答案 1 :(得分:2)

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

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

现在,要访问这些变量,您需要拥有一个对象。如果您在类中的非静态方法中或在类的构造函数中,该方法将使用名为this的对象,因此您可以说this.a或仅{ {1}}获取该变量。如果您不在课堂之外,或者在课程中使用静态方法(包括a),则需要告诉它您正在使用哪个对象。在您的计划中,main方法的对象mainqs,您可以通过说QuadraticSolverqs.a来获取该对象的实例变量{1}}等等。

方法内声明的变量是 local 变量。它们只能在该方法中使用。他们没有为对象声明实例变量。您不能在其上使用关键字qs.b,因为该关键字仅用于实例变量(以及其他不属于变量的事物)。您不能使用该方法之外的变量。如果在一组内部花括号中声明它们,则不能在花括号外使用它们。如果声明一个与实例变量同名的局部变量,则两者之间没有连接。