Java 我想用一个默认的参数化构造函数找到一个数字的阶乘。正在将输出获取为0
我已经声明了一个默认值和一个参数化构造函数。使用单个对象,我同时调用构造函数和函数。当我运行程序时,我得到的输出是0,而不是阶乘。我已经初始化了f=1,但输出仍然是0Java 我想用一个默认的参数化构造函数找到一个数字的阶乘。正在将输出获取为0,java,Java,我已经声明了一个默认值和一个参数化构造函数。使用单个对象,我同时调用构造函数和函数。当我运行程序时,我得到的输出是0,而不是阶乘。我已经初始化了f=1,但输出仍然是0 class Factorial { int num, f; Factorial() { f = 1; } Factorial(int n) { num = n; } public int getFactorial() {
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开始大写的类名。不要缩写变量名。相反:使用能说明名称背后内容的名称!