静态方法只能在处理java时以静态或顶层类型声明

fdbelqdn  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(418)

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

  1. class ball{
  2. public PVector pos;
  3. public PVector vel;
  4. public int radius;
  5. public ball(int r){
  6. pos = new PVector(0,0);
  7. vel = new PVector(3/5,4/5);
  8. radius = r;
  9. }
  10. public void move(){
  11. pos.add(vel);
  12. }
  13. void render(){
  14. circle(pos.x,pos.y,radius);
  15. }
  16. public static PVector tanxd2(PVector inp){//finds value of tan(x/2)
  17. float hyp = sqrt(pow(inp.x,2)+pow(inp.y,2));
  18. float scl = 1/hyp;
  19. PVector ret = new PVector(scl*inp.y, scl*(hyp+inp.x));
  20. return ret;
  21. }
  22. };

产生误差的那一行是:-
公共静态pvector tanxd2(pvector inp){//查找tan(x/2)的值
未使用其他代码,错误为:-
方法tanxd2不能声明为静态的;静态方法只能在静态或顶级类型中声明
任何帮助都将不胜感激。

7xzttuei

7xzttuei1#

如错误信息所示, static 方法只能在顶级类型(不是内部类的类)中声明。这是java的一个限制。
但是 Ball 是顶级类型,对吧?
其实不是。。。这源于处理的预处理器(转换 .pde 将脚本转换为java .class 文件)工作。
在预处理期间,所有类都成为父类(当前不可见)的内部类。而在java中 Ball 类确实应该是顶级类型(因为它没有封闭的父类),当处理脚本变成可运行的java代码时(如下面的示例所示),情况就不再是这样了。

示例

处理程序的预处理器接受如下代码。。。

  1. void setup() {...}
  2. void draw() {...}
  3. class Ball {...}

…并生成一个如下所示的java类:

  1. import processing.core.PApplet;
  2. final class JavaVersion extends PApplet {
  3. public static void main(String[] args) {
  4. PApplet.main(JavaVersion.class);
  5. }
  6. @Override
  7. void setup() {...}
  8. @Override
  9. void draw() {...}
  10. class Ball {...} // ball is an inner class!
  11. }

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

展开查看全部

相关问题