“不能从静态上下文中引用非静态变量”?
问题描述:
我是一个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
我想知道问题是什么?!
答
变化
n = this.fib(n);
到
n = fib(n);
,使方法fib
静态的。
或者,改变
n = this.fib(n);
到
n = new nanoTime().fib(n);
答
的问题是有消息说什么。你main
方法是static
,这意味着它不挂nanoTime
类的一个实例,所以this
并不意味着什么。您还需要制定您的fib
方法static
,然后使用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);
}
}
答
没有理由在代码中使用this
。
采取的步骤:
- 重命名类,任何以一个大写字母开头
- 从代码中删除所有
this
- 添加
static
关键字之前int fib(int n){
- 最后得到好的Java书! ;)
答
要小心!在Java中,主要位于类定义中,但它只是程序的入口点,绝对不是对象/类的方法。
+0
这是什么意思? 'main'肯定是类中的静态方法,可以像其他任何方法一样调用。 JVM可以用它作为入口点,但它仍然只是一种方法。 –
答
更改this.fib(n)
到:
nano obj = new nano();
n = obj.fib(n);
this
与类的实例相关联。静态方法不会与类实例一起运行,而会与类本身一起运行。所以fib
方法要么改变static
或更换,你叫fib
上述两条线的线。
您应该使用CamelCase作为类名......下次将其称为'NanoTime'。 – mellamokb
+1 @JB Nizet - 经常在你的例外情况下搜索,你得到的信息为你的问题提供了很好的结果和解决方案。对于初学者的问题(例如这个问题),这是真实的或者更难理解的问题 – Guillaume
类似于http://stackoverflow.com/questions/926822/java-non-static-variable-cannot-be-referenced-from-a-static -context-error –