Java 我想用一个默认的参数化构造函数找到一个数字的阶乘。正在将输出获取为0

Java 我想用一个默认的参数化构造函数找到一个数字的阶乘。正在将输出获取为0,java,Java,我已经声明了一个默认值和一个参数化构造函数。使用单个对象,我同时调用构造函数和函数。当我运行程序时,我得到的输出是0,而不是阶乘。我已经初始化了f=1,但输出仍然是0 class Factorial { int num, f; Factorial() { f = 1; } Factorial(int n) { num = n; } public int getFactorial() {

我已经声明了一个默认值和一个参数化构造函数。使用单个对象,我同时调用构造函数和函数。当我运行程序时,我得到的输出是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();
    }
}
类阶乘
{
int num,f;
阶乘()
{
f=1;
}
阶乘(整数n)
{
num=n;
}
public int getFactorial()
{

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

在初始值设定项中将
f
设置为
1
,以解决此问题:

int n, f = 1;

Factorial() {
}

Factorial(int n) {
    num = n;
}
这就给类留下了一个大问题:多次调用
getfactorial
将改变类的状态,增加factorial的值。您可以通过创建一个
boolean
变量来解决这个问题,该变量指示是否计算了factorial,并在计算完成后返回
f
已经完成了


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

作为一种良好做法,变量应具有最小的可能范围(首选局部变量,然后是实例变量)。或者换句话说:当您希望在同一类的多个方法之间共享某个日期时,应使用状态变量。但在您的情况下会发生什么?阶乘是一种只需一步即可从单个参数计算的操作:无需进一步处理

因此,我建议您将类重构为:

  • 删除状态变量:将它们转换为局部变量或方法的参数
  • 将阶乘方法设置为静态(正是因为它不需要状态变量)
  • 另一个小细节:参数通过字符串数组(始终)从命令行传递到
    main
    方法
  • 将用户的所有输入和输出只保留在一种方法中,最好是
    main
    方法
  • 所以它将保持这样:

    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);
        }
    }
    
    类阶乘
    {
    公共静态int getFactorial(int num)
    {
    int f=1;
    
    对于(inti=1;我很好……甚至更好:使
    f
    成为一个方法局部变量!@seelenvirtuse这种方法的问题是每次调用
    getfactorial
    时都会重新计算阶乘,这使得类几乎毫无意义。另一方面,当前的设计让OP懒洋洋地计算阶乘,作为练习。@Seelenvirtuose我在发布我之前的评论来解释这一点之前,我已经编辑了答案。很抱歉,显然我忽略了你的一些句子。我今晚应该停止评论。提示:Java开始大写的类名。不要缩写变量名。相反:使用能说明名称背后内容的名称!