我试图通过使用递归方法计算某个整数(从0到21)的阶乘。我在主类之外创建了一个separete方法。但是在main方法中打印factorial时会显示错误。如何解决?
package looping;
import java.io.PrintStream;
public class Looping {
public long fact(long num)
{
if(num<=1)
return 1;
else
return num*fact(num-1);
}
public static void main(String[] args) {
for(int i=0;i<=21;i++){
System.out.printf("%d!=d\n",i,fact(i));
}
}
}
答案 0 :(得分:2)
如果不创建循环类的对象,则无法调用fact()方法。
public static void main(String[] args) {
Looping loop=new Looping()
for(int i=0;i<=21;i++){
System.out.printf("%d!=%d\n",i,loop.fact(i));
}
}
或另一种方法是创建fact()作为类的静态方法。
public static long fact(long num)
{
if(num<=1)
return 1;
else
return num*fact(num-1);
}
答案 1 :(得分:1)
静态方法只调用静态方法 所以只需声明你的方法静态
public static long fact(long num){
}
答案 2 :(得分:1)
你可以做两件事。
无论
(1)您可以在fact
的声明中添加static
一词,使public
成为静态方法。
或
(2)您可以创建Looping
类的对象,并使用它来运行fact
的调用,就像这样。
public static void main(String[] args) {
Looping looping = new Looping();
for(int i=0;i<=21;i++){
System.out.printf("%d!=%d\n", i, looping.fact(i));
}
}
它没有任何区别,因为Looping
类的对象没有任何字段,这意味着它不随身携带任何数据。你是否做这样的对象并不重要;除了使用非静态方法的事实,你需要一个对象。
如果对象有一些字段,那么非静态方法可以引用那些字段。但由于没有字段,方法是否为静态没有区别。因此,我可能在这里选择选项(1) - 只需将方法设为静态。
但是,如果将来我希望在Looping
类(即子类)上有变体,每个类的fact
方法的实现略有不同;那我真的需要选择选项(2)。在子类中,您不能真正拥有静态方法的不同版本。当你编写一个类时,你真的不知道将来是否会想要它的某些子类的行为略有不同。这些可能是将在您的程序中使用的子类,或者它们可能是您用于测试的模拟子类。
因此,当然,总是值得避免使用静态方法。任何类都需要的唯一静态方法是main
方法。任何其他静态方法都可能会导致您出现问题,因为您的程序增长并且您有越来越多的类。静态方法可以使测试更加困难。它们肯定会使实现多态性变得更加困难。
我意识到这个论点可能超出了你当前的Java知识。但是值得理解选项(2)中发生的事情,并养成使用它的习惯,而不是默认情况下使所有方法都是静态的。
答案 3 :(得分:0)
/
Looping looping = new Looping();
for(int i=0;i<=21;i++){
System.out.printf("%d!=d\n",i,looping.fact(i));
}
答案 4 :(得分:0)
static
表示“不需要位于使用new
创建的对象内”
非 - static
表示你需要进入这样的对象。 this
必须可用。
答案 5 :(得分:0)
似乎你忘了创建类的对象
Looping loop=new Looping();
for(int i=0;i<=21;i++){
System.out.printf("%d!=d\n",i,loop.fact(i));
}