Java &引用;非静态变量不能从静态上下文中引用此变量;?
我是一个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
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中,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);