静态方法:无法在静态上下文中引用非静态
2017-10-14 14:54
351 查看
如上是经典的Fobonacci递归算法:
public class Fibonacci
{
public static void main(String []args)
{
int x = f(6);
System.out.println(x);
}
public int f(int x)
{
if(x==1||x==2)
return 1;
else
return f(x-1)+f(x-2);
}
}
编译后出错,无法在静态上下文中引用非静态。
原来,在静态的方法中不能直接调用非静态的方法或属性。因为一个类的静态方法在这个Class文件被加载之后,就可以由这个Class类型对象来调用,而非静态的方法需要一个实例对象,有可能还未被创建,所以为了避免在静态方法中调用一个还不存在的实例对象的非静态方法,编译期就会直接阻止这个行为。
解决的方法有两种,第一种是将被调用的方法设置成静态方法;第二种是new本类,然后通过实例来调用。
第一种:
public class Fibonacci
{
public static void main(String []args)
{
int x = f(6);
System.out.println(x);
}
public int f(int x)
{
if(x==1||x==2)
return 1;
else
return f(x-1)+f(x-2);
}
}
编译后出错,无法在静态上下文中引用非静态。
原来,在静态的方法中不能直接调用非静态的方法或属性。因为一个类的静态方法在这个Class文件被加载之后,就可以由这个Class类型对象来调用,而非静态的方法需要一个实例对象,有可能还未被创建,所以为了避免在静态方法中调用一个还不存在的实例对象的非静态方法,编译期就会直接阻止这个行为。
解决的方法有两种,第一种是将被调用的方法设置成静态方法;第二种是new本类,然后通过实例来调用。
第一种:
public class Fibonacci { public static void main(String []args) { int x = f(6); System.out.println(x); } public static int f(int x) { if(x==1||x==2) return 1; else return f(x-1)+f(x-2); } }第二种:
public class Fibonacci { public static void main(String []args) { Fibonacci f = new Fibonacci(); int x = f.f(6); System.out.println(x); } public int f(int x) { if(x==1||x==2) return 1; else return f(x-1)+f(x-2); } }
相关文章推荐
- 无法从静态上下文中引用非静态
- 由“无法从静态上下文中引用非静态方法”引出的疑问
- 无法从静态上下文引用非静态方法,非静态上下文中,可以访问静态方法吗?
- 无法从静态上下文中引用非静态方法
- 无法从静态上下文中引用非静态 变量 this
- JAVA学习【2】错误:无法从静态上下文中引用非静态
- 无法从静态上下文中引用非静态方法
- 错误: 无法从静态上下文中引用非静态 变量 this
- 无法从静态上下文中引用非静态 变量 this
- 无法从静态上下文中引用非静态变量,非静态方法
- java编译时出现无法从静态上下文中引用非静态
- C#变量初始化问题:字段初始值无法引用非静态字段、方法或属性
- 静态方法内无法访问非静态字段
- 传值调用与引用调用/多态/方法重载/构造函数/静态与非静态/属性、方法作用范围/字段与属性
- [C#]变量初始化问题:字段初始值无法引用非静态字段、方法或属性
- Java静态方法:无法从静态上下文中引入非静态方法
- C#类和结构介绍,方法介绍,值传递和引用传递,静态和非静态,字符串方法介绍
- 字段初始值无法引用非静态字段、方法
- C# 类中变量初始化:字段初始值无法引用非静态字段、方法或属性
- 字段初始值设定项无法引用非静态字段、方法或属性的问题