[英]Problem in creating new instance using the default constructor. The default constructor triggered an exception
[英]I want to find the factorial of a number using a default and parameterize constructor. getting output as 0
我已经声明了一个默认值和一个参数化构造函数。 使用单个对象我同时调用构造函数和函数。 当我运行程序时,我得到输出为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();
}
}
这是因为当使用factorial(int n)
构造函数初始化类时, f
的初始值保持为零。
在初始化程序中将f
设置为1
以解决此问题:
int n, f = 1;
Factorial() {
}
Factorial(int n) {
num = n;
}
这给你的课留下了一个大问题:多次调用getfactorial
将改变类的状态,增加阶乘的值。 您可以通过创建一个boolean
变量来指明是否已经计算了阶乘,并在执行计算后返回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);
}
}
更简单,不是吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.