为什么Processing(Java)中的这个静态属性会引发错误?

时间:2014-05-19 22:50:17

标签: java oop processing

这是我在加工中的课程......

class Stripe {

  PShape s;
  float x, y, w;

  static Stripe lastStripe;


  Stripe() {
    x = width / 2;
    y = 0;
    w = 150;
    s = createShape();
    s.beginShape();
    s.fill(0);
    s.noStroke();
    s.vertex(w, 0);
    s.bezierVertex(w + 50, height * 1/4, w - 50 , height * 1/3, w, height); 
    s.vertex(0, height);
    s.bezierVertex(-50, height * 1/3, 50 , height * 1/4, 0, 0); 
    //s.vertex(0, 0);


    //s.bezierVertex(50, 50, 50, 50, 100, 100); 
    s.endShape(CLOSE);
  }

  void draw() {
    pushMatrix();
    translate(x, y);
    shape(s);
    popMatrix();

  }

  void move() {
    x = x + STRIPE_VEL;

    if (x > (width + OFFSCREEN_BUFFER)) {
      x =  Stripe.lastStripe.x - STRIPE_SPACING;
      Stripe.lastStripe = this;
    }

  }

}

当我尝试编译时,我收到以下错误......

  

字段lastStripe只能声明为static;静态字段只能在静态或顶级类型中声明

看看这个Java tutorial,这似乎是一个有效的Java模式。虽然上面的代码是自引用的,但如果类型更改为int或类似,它仍会引发相同的错误。

这里有什么问题?

编辑:根据要求,这是另一个标签中草图的其余部分。我开始认为处理方式只是将这些变量声明为全局'而不是类上的静态变量...我可能只是这样做。

float STRIPE_VEL = 0.5;
float OFFSCREEN_BUFFER = 500;
float STRIPE_SPACING = 50;

int numStripes = 0;

Stripe[] stripes;


void setup() {

  float offset = 0;
  size(800, 600, P2D);
  smooth();

  numStripes = (width + 2 * OFFSCREEN_BUFFER) / STRIPE_SPACING;
  stripes = new Stripe[numStripes];

  for (int i=0; i < numStripes; i++) {
    stripes[i] = new Stripe();
    stripes[i].x = offset;
    offset = offset + inc;
  }
  Stripe.lastStripe = stripes[0];

}


void draw() {
  background(255);

  for (int i=0; i < numStripes; i++) {
    stripes[i].draw();
    stripes[i].move();
  }

  //blurAll();


}

2 个答案:

答案 0 :(得分:2)

尝试将特定文件(即Stripe.pde)重命名为Stripe.java。你在那里评论是对的:&#34;编译处理将它嵌入到另一个类&#34;中,实际上处理草图中的所有选项卡都包含在一个大的java(顶级)类中......所以,重命名其中一个.java将迫使它成为顶级班级!

答案 1 :(得分:1)

将内部类Stripe更改为声明为static(内部)类:

static class Stripe {
  ...
}

这将确保Stripe每个Stripe实例不需要封闭类的实例,并且您将能够创建类变量(静态字段)


作为旁注,如果内部类static实际上不需要封闭类的实例,那么创建内部类{{1}}总是更好的做法。