运行Java代码遇编译报错:静态方法引用非静态字段问题排查
问题根源
编译器抛出的三个错误本质都是同一个原因:
main方法是Java程序的固定入口,被static修饰,属于类层级的方法,不需要创建类实例就能运行- 你定义的
Scannerobj(Scanner输入实例)、var1都是非静态成员变量,仅属于Helloworld类的实例对象,没有创建实例时这些变量根本不存在 - 静态上下文无法直接访问非静态成员,因此直接在
main中调用这两个变量就会触发编译错误
另外原代码还有逻辑顺序bug:输入提示语在读取输入操作之后才打印,程序会先阻塞等待用户输入,再弹出提示,交互逻辑反了。
修复方案
方案1:最简适配(适合小型demo)
将需要在main方法中使用的成员变量添加static修饰,使其归属到类层级,即可被静态方法直接访问。同时调整输入提示的打印顺序:
import java.util.*; class Helloworld{ static Scanner Scannerobj = new Scanner(System.in); static int var1; public static void main(String[] args){ System.out.println("hello world"); System.out.println("Enter the value of var1"); var1 = Scannerobj.nextInt(); System.out.println(var1); } }
方案2:符合面向对象规范的写法
如果希望保留成员变量的非静态属性,可在main方法中先创建Helloworld的实例对象,通过实例访问非静态成员:
import java.util.*; class Helloworld{ Scanner Scannerobj = new Scanner(System.in); int var1; public static void main(String[] args){ System.out.println("hello world"); // 先创建类实例,再通过实例访问非静态成员 Helloworld helloInstance = new Helloworld(); System.out.println("Enter the value of var1"); helloInstance.var1 = helloInstance.Scannerobj.nextInt(); System.out.println(helloInstance.var1); } }
补充提示:Java变量推荐使用小驼峰命名(首字母小写),比如将Scannerobj改为scannerObj,不影响功能但更符合行业编码规范。
内容的提问来源于stack exchange,提问作者Souvik
相关产品推荐
相关产品推荐

