【问题标题】:"non-static variable this cannot be referenced from a static context"?“非静态变量不能从静态上下文中引用”?
【发布时间】:2011-11-30 02:11:10
【问题描述】:

我是 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

我想知道是什么问题?!

【问题讨论】:

  • 你应该使用 CamelCase 作为类名...下次叫它NanoTime
  • +1 @JB Nizet - 经常在谷歌上搜索您的异常并且您收到的消息会为您提供良好的结果和解决问题的方法。对于初学者的问题(例如这个)或更多晦涩的问题,这是正确的

标签: java recursion static syntax-error


【解决方案1】:

this.fib(n) 更改为:

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

this 与类的实例相关联。静态方法不与类实例一起运行,而是与类本身一起运行。所以要么把fib方法改成static,要么把你调用fib的那行换成上面两行。

【讨论】:

    【解决方案2】:
    # 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);
        }
    }
    

    【讨论】:

      【解决方案3】:

      改变

      n = this.fib(n);
      

      n = fib(n);
      

      并将方法 fib 设为静态。

      或者,改变

      n = this.fib(n);
      

      n = new nanoTime().fib(n);
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 这是什么意思? main 肯定是类上的静态方法,可以像任何其他方法一样调用。 JVM可以把它作为入口点,但它仍然只是一个方法。
        【解决方案5】:

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

        采取的步骤:

        1. 将您的班级重命名为以大写字母开头的任何内容
        2. 从您的代码中删除所有this
        3. int fib(int n){ 之前添加static 关键字
        4. 终于拿到一本好的Java书了! ;)

        【讨论】:

          【解决方案6】:

          问题正是消息所说的。你的main 方法是static,这意味着它没有链接到nanoTime 类的实例,所以this 没有任何意义。您还需要将fib 方法设为static,然后使用nanoTime.fib(n)

          【讨论】:

            【解决方案7】:

            您需要实例化nanoTime 来调用实例方法,或者也将fib 方法设为静态。

            【讨论】:

            • 很遗憾我不知道你在说什么!
            • @James See Mouscellaneous 的回答;一般来说,我只指出作业的东西,而不是拼写:)
            • @DaveNewton 即使您将 fib 方法设为静态,它也会抛出编译时错误,提示“nanoTime.this cannot be referenced from a static context”。原因:他们的关键字 this 指的是类的实例。在静态上下文中,您没有实例,因此您无法引用它。来源:stackoverflow.com/questions/16315488/…
            • @Joey 显然,如果将方法设为静态,则需要更改代码以删除 this 上下文...:/我知道差异。
            猜你喜欢
            • 2019-03-17
            • 1970-01-01
            相关资源
            最近更新 更多