Java &引用;非静态变量不能从静态上下文中引用此变量;?

Java &引用;非静态变量不能从静态上下文中引用此变量;?,java,recursion,static,syntax-error,Java,Recursion,Static,Syntax Error,我是一个Java新手,我试图通过递归函数部署斐波那契轨迹,然后计算运行时。 以下是我设法编写的代码: class nanoTime{ int fib(int n){ if(n==0) return 0; if(n==1) return 1; return this.fib(n-1)+this.fib(n-2); } public static void main(String[] args){ double

我是一个Java新手,我试图通过递归函数部署斐波那契轨迹,然后计算运行时。 以下是我设法编写的代码:

class nanoTime{
    int fib(int n){
        if(n==0) return 0;
        if(n==1) return 1;
        return this.fib(n-1)+this.fib(n-2);
    }
    public static void main(String[] args){
        double beginTime,endTime,runTime;
        int n=10;
        beginTime = System.nanoTime();
        n = this.fib(n);
        endTime = System.nanoTime();
        runTime = endTime-beginTime;
        System.out.println("Run Time:" + runTime);
    }
}
问题是,当我试图将其转换为字节码时,会出现以下错误:

nanoTime.java:11: non-static variable this cannot be referenced from a static context

我想知道是什么问题

您需要实例化一个
nanoTime
来调用实例方法,或者使
fib
方法也是静态的。

更改

n = this.fib(n);

并使方法
fib
静态

或者,改变

n = this.fib(n);


问题就在于信息所说的。您的
main
方法是
static
,这意味着它没有链接到
nanoTime
类的实例,因此
这个
没有任何意义。您还需要使您的
fib
方法
static
,然后使用
nanoTime.fib(n)


没有理由在您的代码中使用

采取的步骤:

  • 将类重命名为以大写字母开头的任何内容
  • 从代码中删除所有
  • intfib(intn){
  • 终于有一本好的Java书了!;)

  • 小心!在Java中,main必须位于类定义中,但它只是程序的入口点,绝对不是对象/类的方法。

    this.fib(n)
    更改为:

    nano obj = new nano();   
    n = obj.fib(n);   
    

    与类的实例相关联。静态方法不会与类实例一起运行,而是与类本身一起运行。因此,请将
    fib
    方法更改为
    static
    ,或者将调用
    fib
    的行替换为上述两行。

    您应该使用CamelCase作为类名…调用
    >NanoTime
    下一次。+1@JB Nizet-经常在谷歌上搜索您的异常情况,您得到的消息会为您的问题提供很好的结果和解决方案。对于初学者的问题,这是正确的(如此)或者更模糊的问题类似于不幸的是,我不知道你在说什么!@James See mouscellaneus的回答;一般来说,对于家庭作业内容,我只指出,而不是拼写:)@DaveNewton即使你将fib方法设为静态,它也会抛出一个编译时错误,说“nanoTime.this不能从静态上下文引用”。原因:他们关键字这指的是类的实例。在静态上下文中,您没有实例,因此无法引用它。来源:@Joey显然,如果方法是静态的,则需要更改代码以删除
    this
    上下文…:/I我知道这些差异。这意味着什么?
    main
    most certainly是类上的一个静态方法,可以像任何其他方法一样调用。JVM可以将其用作入口点,但它仍然只是一个方法。
    n = new nanoTime().fib(n);
    
    # Name the class something else to avoid confusion between System.nanoTime and the name of your class.
    
    class nanoTime1{
        int fib(int n){
            if(n==0) return 0;
            if(n==1) return 1;
            return this.fib(n-1)+this.fib(n-2);
        }
    
        public static void main(String[] args){
            double beginTime,endTime,runTime;
            int n=10;
            beginTime = System.nanoTime();
    
    
            # Instantiate an object of your class before calling any non-static member function
    
            nanoTime1 s = new nanoTime1();
            n = s.fib(n);
            endTime = System.nanoTime();
            runTime = endTime-beginTime;
            System.out.println("Run Time:" + runTime);
        }
    }
    
    nano obj = new nano();   
    n = obj.fib(n);