Java 如何在内部类中近似使用静态变量?

Java 如何在内部类中近似使用静态变量?,java,static,abstract-class,processing,Java,Static,Abstract Class,Processing,我正在处理一系列的类,这些类都继承自一个单一的基类和抽象类 为了跟踪所有这些子类,我想实现类似于GUID的东西——出于我的目的,它不必是实际的GUID,而只是子类的每个实例所特有的int。递增的int是我一直希望使用的 我想做的是在我的抽象类中实现以下内容: abstract class ParentObject{ static int GUID = 0; //other stuff } 此后,每个子类在其构造函数中都将具有myGUID=GUID++ 但是,每当我尝试此操作时

我正在处理一系列的类,这些类都继承自一个单一的基类和抽象类

为了跟踪所有这些子类,我想实现类似于GUID的东西——出于我的目的,它不必是实际的GUID,而只是子类的每个实例所特有的int。递增的int是我一直希望使用的

我想做的是在我的抽象类中实现以下内容:

abstract class ParentObject{

   static int GUID = 0;

   //other stuff

}
此后,每个子类在其构造函数中都将具有
myGUID=GUID++

但是,每当我尝试此操作时,都会从处理IDE中得到以下错误:

字段GUID不能声明为静态;静态字段只能是 以静态或顶级类型声明

由于处理是如何处理类文件的(一切都是一个内部类),我不能有静态类成员。我可以选择哪些方式以其他方式复制此功能

编辑:这是在Processing和Processing IDE中完成的。ParentObject类在其自己的处理文件中


Edite2:我了解到处理不同于Java的原因是所有处理类都是内部类。正因为如此,我重新添加了Java标记并重新表述了问题。

一个受静态保护的方法getNextGUID()可以工作

public abstract class ParentObject{

   private static int GUID = 0;

   protected static int getNextGUID(){
       return GUID++;
   }
   //other stuff

}

当您有多个线程时,不要忘记同步它/使用AtomicInteger。好吧,然后面对它。你不能这么做。如果您确实需要它,请声明一个外部类来处理这段代码,并在顶级类的构造函数中调用它

如果必须使用innerclass的这个层次结构,那么就不能这样做。Java不会以您不希望的方式接受它。您可以将抽象类声明为静态类

static abstract class ParentObject {

    private static int GUID = 0;

}
但我几乎可以肯定这对你也不起作用。因此,我建议在其他地方创建一个新的外部类来处理它

public class GUID {

    private static int GUID = 0;

    public synchronized static void increment() {
        GUID++;
    }
}

abstract class ParentObject {

    ParentObject() {

        GUID.increment();

        // constructor's stuff
    }

}

这可能会降低你的应用程序的速度(取决于你实例化一个类的频率),但不是很重要。

事实上,想想看,在这种情况下,父类本身是抽象的有什么好处吗?如果我只是将所有的方法/参数改为抽象的,它就不会破坏继承树……我的java编译器(
javac1.6.0_26
)很好地接受了这段代码。你到底在用什么?我的编译器
1.7.0
也接受这一点。Eclipse也允许这样做,而且工作正常。如果你的编译器不接受这一代码,那么你使用的语言就不是Java。这很接近,但不是真的。如果语言不允许在抽象类中使用静态变量,我担心这种方法也不会起作用。事实上,我没有看到任何合理的方法来解决这个问题(如果允许使用静态最终变量,我们可以使用包装器类)是的,我想我只是要离开处理IDE。它给了我各种各样的痛苦。