静态方法只能在Processing Java中以静态或顶级类型声明



所以我在Windows上制作了一个处理3.5.4-Java的程序,出现了一个奇怪的错误。我在网上寻找调试它的方法,但找不到可行的答案。

class ball{
public PVector pos;
public PVector vel;
public int radius;
public ball(int r){
pos = new PVector(0,0);
vel = new PVector(3/5,4/5);
radius = r;
}
public void move(){
pos.add(vel);
}
void render(){
circle(pos.x,pos.y,radius);
}
public static PVector tanxd2(PVector inp){//finds value of tan(x/2)
float hyp = sqrt(pow(inp.x,2)+pow(inp.y,2));
float scl = 1/hyp;
PVector ret = new PVector(scl*inp.y, scl*(hyp+inp.x));
return ret;
}
};

出现错误的行是:-

公共静态PVector tanxd2(PVector inp({//查找tan(x/2(的值

未使用其他代码,错误为:-

方法tanxd2不能声明为静态;静态方法只能在静态或顶级类型中声明

如有任何帮助,我们将不胜感激。

如错误消息所示,static方法只能在顶级类型(不是内部类的类(中声明。这是Java的一个限制。

但是Ball是顶级类型,对吧?

其实不是。。。这源于Processing的预处理器(将.pde脚本转换为Java.class文件的东西(的工作方式。

在预处理过程中,所有类都成为(当前不可见的(父类的内部类。尽管在Java中,Ball类确实是顶级类型(因为它没有封闭的父类(,但当Processing脚本变成可运行的Java代码时,情况就不再是这样了(如下所示(。

示例

Processing的预处理器接收的代码如下。。。

void setup() {...}
void draw() {...}
class Ball {...}

并生成一个结果Java类,该类看起来像这样

import processing.core.PApplet;
final class JavaVersion extends PApplet {
public static void main(String[] args) {
PApplet.main(JavaVersion.class);
}
@Override
void setup() {...}

@Override
void draw() {...}

class Ball {...} // ball is an inner class!
}

回到错误消息:处理只是强制执行Java限制——当然,在我们考虑预处理器的行为之前,这些代码是否会触发这样的限制并不明显。

最新更新