无法对非静态字段进行静态引用

时间:2013-10-31 21:28:24

标签: java reference static

我试图创建课程并且已经部分成功了。但是当我尝试在我的main method中创建内容时,我几乎在所做的一切上都会遇到这些错误。如果我在其他方法中创建这些东西,然后从我的main方法调用它,它就可以工作。

但那不是我应该做的,所以我需要修复它,以便main方法中的东西起作用。我得到的第一个错误是当我尝试在主对象中创建对象t1时,我收到错误Cannot make a static reference to the non-static field Ystart

import java.util.Random;
import se.lth.cs.window.SimpleWindow;
public class Racetrack {
Random rand = new Random();
int i = 0;
int x;
int Ystart;
int Ygoal;
int RaceTrack;
//SimpleWindow w = new SimpleWindow(500, 500, "22niggs");



public static void main(String[]args) {
    SimpleWindow w = new SimpleWindow(500, 500, "Angels");

    Racetrack race = new Racetrack(100,400);
    race.draw(w);
    Turtle t1 = new Turtle(w,50,Ystart);
    Turtle t2 = new Turtle(w,400,Ystart);
    t1.penDown();
    t2.penDown();
    while(i==0){
    x=rand.nextInt(10); 
    t1.forward(x);
    x = rand.nextInt(5);
    t2.forward(x);
    SimpleWindow.delay(100 );
    }

}

    public Racetrack(int Ystart, int Ygoal){ //KONSTRUKTOR
    this.Ystart =Ystart;
    this.Ygoal = Ygoal; 


    }
    public void draw(SimpleWindow w){

    w.moveTo(50, Ystart);
    w.lineTo(450, Ystart);
    w.moveTo(50, Ygoal);
    w.lineTo(450, Ygoal);

    }
    public void RacingEvent(Racetrack track, Turtle t1, Turtle t2){


    }

3 个答案:

答案 0 :(得分:0)

问题是main是静态的,即整个类只有一个,而Ystart不是静态的,并且是为每个对象创建的。 然后,当你试图从main访问Ystart时,问题是-Ystart是什么实例?由于没有好的答案,因此会产生编译错误。

如果要在主屏幕中使用它,可以将Ystart标记为静态。

答案 1 :(得分:0)

这意味着没有实例就无法引用实例字段。在您的情况下,最简单的解决方案是

  • 创建要使用的实例
  • 使该字段静止。我不喜欢这个选项。

Turtle t1 = new Turtle(w,50,race.Ystart);
Turtle t2 = new Turtle(w,400,race.Ystart);

我会制作你的随机数生成器static,因为每个实例只有一个值很少。

答案 2 :(得分:0)

静态方法或字段作为类的一部分存在,并且独立于该类的实例。非静态方法或字段取决于这种实例的存在。因此,您可以在对象上调用非静态方法,例如race.draw()虽然您可以从班级调用静态方法,例如Racetrack.main(new String[]{"one", "two", "three"});