Java报错:非静态方法无法从静态上下文引用(无静态成员)
解决PlayerShip调用Gun.Move时的静态上下文错误问题
嘿,这个问题其实很常见,我马上给你捋清楚!你遇到的non-static method Move(int) cannot be reference from a static context错误,核心原因是你在尝试用类名直接调用非静态方法——而Java里非静态方法必须通过类的实例对象来调用,不能直接用Gun.Move()这种方式哦。
再看看你的代码问题:你在PlayerShip的构造方法里创建了gun1和gun2两个Gun对象,但这俩是构造方法的局部变量,构造方法执行完就被销毁了,所以你的Move方法根本访问不到它们。这才导致你想直接用类名调用,但这恰恰踩了非静态方法的调用规则。
而且评分软件不让用静态变量/方法,那我们就换个思路,把Gun对象变成PlayerShip的成员变量就行了!
修改后的PlayerShip代码:
public class PlayerShip { private int position; // 把gun1和gun2定义为PlayerShip的成员变量 private Gun gun1; private Gun gun2; public PlayerShip() { position = Global.promptInt("Player position: "); // 在构造方法里初始化这两个成员变量 gun1 = new Gun(position - 1, 5); gun2 = new Gun(position + 1, 5); } public void Move(int distance) { position = position + distance; // 通过Gun的实例对象调用Move方法,两次调用正好对应要求 gun1.Move(distance); gun2.Move(distance); } }
为什么这样能解决问题?
- 把
gun1和gun2从构造方法的局部变量改成PlayerShip的成员变量后,整个PlayerShip类的方法(包括Move)都能访问到这两个Gun实例了。 - 现在调用的是
gun1.Move(distance)和gun2.Move(distance),都是通过具体的Gun对象调用非静态方法,完全符合Java的语法规则,也没有用到任何静态元素,完美满足评分要求。
Gun类的代码不需要修改,保持你原来的就行啦!
内容的提问来源于stack exchange,提问作者Jaffar Rizvi
相关产品推荐
相关产品推荐

