我已经声明了一个默认值和一个参数化构造函数。使用单个对象我同时调用构造函数和函数。当我运行程序时,我得到输出为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();
}
}
答案 0 :(得分:3)
这是因为当使用f
构造函数初始化类时,factorial(int n)
的初始值保持为零。
在初始化程序中将f
设置为1
以解决此问题:
int n, f = 1;
Factorial() {
}
Factorial(int n) {
num = n;
}
这会给你的课留下一个大问题:多次调用getfactorial
会改变类的状态,增加阶乘的值。您可以通过创建一个boolean
变量来指明是否已经计算了阶乘,并在计算完成后返回f
来解决此问题。
如果您不需要“懒惰”计算,请在方法中将f
设为局部变量。
答案 1 :(得分:0)
作为一种好的做法,变量应该具有最小可能范围(首选本地,然后是实例)。或者换句话说:当您想要在同一个类的多个方法之间共享某个日期时,应该使用状态变量。但在你的情况下呢?因子是一个操作,只需一步即可从一个参数计算:无需进一步处理。
所以,我建议你将你的课程重构为:
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);
}
}
更简单,不是吗?