我想使用default和parameterize构造函数找到数字的阶乘。输出为0

时间:2016-10-26 17:38:44

标签: java

我已经声明了一个默认值和一个参数化构造函数。使用单个对象我同时调用构造函数和函数。当我运行程序时,我得到输出为0而不是获得阶乘。我初始化f = 1仍然输出为0.

class Factorial
{
    int num, f;

    Factorial()
    {
        f = 1;
    }

    Factorial(int n)
    {
        num = n;
    }

    public int getFactorial()
    {
        for(int i = 1; i <= num; i++)
        {
            f = f * i;
        }   
        System.out.println("Factorial= " + f);
        return f;
    }

    public static void main(int m)
    {     
        Factorial obj = new Factorial();
        obj = new Factorial(m);
        obj.getFactorial();
    }
}

2 个答案:

答案 0 :(得分:3)

这是因为当使用f构造函数初始化类时,factorial(int n)的初始值保持为零。

在初始化程序中将f设置为1以解决此问题:

int n, f = 1;

Factorial() {
}

Factorial(int n) {
    num = n;
}

这会给你的课留下一个大问题:多次调用getfactorial会改变类的状态,增加阶乘的值。您可以通过创建一个boolean变量来指明是否已经计算了阶乘,并在计算完成后返回f来解决此问题。

如果您不需要“懒惰”计算,请在方法中将f设为局部变量。

答案 1 :(得分:0)

作为一种好的做法,变量应该具有最小可能范围(首选本地,然后是实例)。或者换句话说:当您想要在同一个类的多个方法之间共享某个日期时,应该使用状态变量。但在你的情况下呢?因子是一个操作,只需一步即可从一个参数计算:无需进一步处理。

所以,我建议你将你的课程重构为:

  1. 删除状态变量:将它们转换为局部变量或方法的参数。
  2. 将阶乘方法设置为静态(正是因为它不需要状态变量)。
  3. 另一个小细节:参数通过字符串数组从命令行传递到main方法 - 总是如此。
  4. 只使用一种方法将所有输入和输出保留给用户,最好是main方法。
  5. 所以它会保持这样:

    class Factorial
    {
        public static int getFactorial(int num)
        {
            int f=1;
            for (int i = 1; i <= num; i++)
            {
                f = f * i;
            }   
            return f;
        }
    
        public static void main(String[] args)
        {     
            int m=Integer.parseInt(args[0]);
            int factorial=Factorial.getFactorial(m);
            System.out.printf("factorial of %d is %d\n", m, factorial);
        }
    }
    

    更简单,不是吗?