如何修复错误“无法从静态上下文引用非静态方法”?

时间:2013-12-27 10:56:15

标签: java

我试图通过使用递归方法计算某个整数(从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));
        }

    }
}

6 个答案:

答案 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));
    }