我创建了一个类Obstacle,它带有一个Obstacle构造函数和一个函数。
package environment;
import static java.lang.System.out;
import environment.WorldEnvironment;
public class Obstacle {
private String obstacleType, setObstacleType;
private int obstacleSize, obstacleXCoord, obstacleYCoord, setObstacleSize, setObstacleXCoord, setObstacleYCoord;
public Obstacle(String getType, int getSize, int getXCoord, int getYCoord){
obstacleType = getType;
obstacleSize = getSize;
obstacleXCoord = getXCoord;
obstacleYCoord = getYCoord;
}
public void generateObstacle(int getPlayerCurrentXCoord, int getPlayerCurrentYCoord){//code in generateObstacle}
在我的main方法中,我从另一个类调用generateObstacle()(注意这个类和Obstacle类都在同一个包中)。
import environment.Obstacle;
public void main(String[] args){
spawnPlayer();
while(runGame){
//one example of calling some Obstacle member variables and calling generateObstacle()
switch((playerInput.nextLine()).toUpperCase()){
case "W":
if(currentXCoord + 1 == Obstacle.obstacleXCoord && Obstacle.obstacleYCoord == currentYCoord){
out.println("There is a " + (Obstacle.obstacleType).toLowerCase() + " where you are trying to go.");
printPlayerCoords();
}
else{
movePlayerForward();
printPlayerCoords();
if(spawnObstacle.nextInt(8) == 3){
Obstacle.generateObstacle(currentXCoord, currentYCoord);
}
}
break;
全部
Obstacle.
变量引用抛出一个错误,说"不能对非静态字段进行静态引用。
是一样的Obstacle.generateObstacle(currentXCoord, currentYCoord);
我不确定为什么我会收到此错误,因为没有Obstacle的成员变量是静态的,而main方法不是静态的。 generateObstacle()方法本身也没有静态字段。这是障碍构造者:
Obstacle newObstacle = new Obstacle(setObstacleType, setObstacleSize, setObstacleXCoord, setObstacleYCoord);
是否有人可以向我解释为什么我会收到此错误?是的,我已经环顾四周但没有找到任何好的解释性解决方案。提前致谢。
答案 0 :(得分:3)
您无法像这样调用generateObstacle()
方法 -
Obstacle.generateObstacle(currentXCoord, currentYCoord);
由于generateObstacle()
是另一个类中的非静态方法。
<强>解决方案:强>
(1)将generateObstacle()
方法设为静态,并使用类名称
Obstacle.generateObstacle(currentXCoord,currentYCoord);
(2)或创建Obstacle
的实例,说anObstacle
使用它来调用方法 -
Obstacle anObstacle = new Obstacle(...);
anObstacle.generateObstacle(currentXCoord, currentYCoord);
注意:类的非静态类型成员(即方法或变量)存在于类的对象中。这意味着non-static
成员仅在创建对象时可用。对于类的static
成员,情况并非如此。您可以在不创建类的实例/对象的情况下访问类的static
成员。
答案 1 :(得分:2)
如果要从main方法调用它们,请将main方法保持为静态并将其他方法设置为静态。
您必须为JVM提供静态主方法
JVM需要调用main方法作为应用程序的入口点,而不必创建包含类的实例。
答案 2 :(得分:1)
Obstacle.generateObstacle(currentXCoord, currentYCoord);
这是对非静态方法的静态调用。引用类名时,它是静态引用。您的generateObstacle方法不是静态的,因此是错误。
尝试创建类的实例,然后引用它。
Obstacle obstacle = new Obstacle(...arguments...);
obstacle.generateObstacle(currentXCoord, currentYCoord);
答案 3 :(得分:1)
您的generateObstacle
方法是一种非静态方法,这意味着每个障碍实例都有自己的方法,能够访问同一个实例的状态(字段)。
在静态上下文(这里是main
方法)中,没有实例可以调用该方法。因此,在没有实际构建实例的情况下尝试调用非静态方法是没有意义的。
要进行一个真实世界的比喻,就像尝试驾驶汽车(在汽车类的特定实例上调用steer
方法)而不实际拥有汽车。
您的问题有两种可能的解决方案:
- 构造一个Obstacle类的实例(Obstacle o = new Obstacle()
),然后在其上调用generateObstacle
方法;
- 或者generateObstacle
静态,如果它不依赖于任何特定实例的状态。
看到您的Obstacle类有状态(字段),第一个是唯一的解决方案。