我是否可以为每种不同类型的inheritance类使用静态变量的不同副本

我希望具有相同的静态变量,具有不同的值,具体取决于类的类型。

所以我会的

public class Entity { public static Bitmap sprite; public void draw(Canvas canvas, int x, int y) { canvas.drawBitmap(sprite, x, y, null); } } public class Marine extends Entity { } public class Genestealer extends Entity { } 

然后在我的主程序中去:

 Marine.sprite = // Load sprite for all instances of Marine Genestealer.sprite = // Load sprite for all instances of Genestealer 

我不想在类的每个实例中存储相同的sprite。 我希望每种类型都有一个。 我想inheritance静态精灵变量和绘制精灵的绘制函数。 但我不希望Genstealer精灵覆盖Marine精灵。

这可能吗?

我该怎么办?

使用抽象方法:

 public class Entity { public abstract Bitmap getSprite(); public void draw(Canvas canvas, int x, int y) { canvas.drawBitmap(getSprite(), x, y, null); } } public class Marine extends Entity { public Bitmap getSprite() { return /*the sprite*/; } } 

如果你愿意,getSprite返回的精灵可以是静态的。 关于这种方法的好处:

  • 你不能(轻易地)忘记在你的子类中包含一个sprite,因为如果你没有实现抽象方法,编译器会抱怨。

  • 它很灵活。 假设海军陆战队员一旦“升级”就应该看起来不同。 只需更改Marine的getSprite方法即可将该级别考虑在内。

  • 对于这类事情来说,它是标准的OO-idiom,所以看着他们的代码的人不会留下他们的头脑。

它不可能在超类中是静态的。 超类中的静态变量由所有子类共享(实际上是单例)。 无论何时更改它(例如,通过实例化子类),该更改都会反映在所有其他子类实例中。

相反,在子类中使sprite静态,然后使用Laurence描述的方法结构。

所以制作一个Sprite并给每个实例变量。 它们只是参考; 几乎没有指针。

快速测试将向您显示,是的,您可以覆盖子类中的静态变量。

我已经整理了一个简单的inheritance结构来测试它。 StaticTest是StaticTestSub的超级。 它们都声明了具有不同访问TEST3静态内容TEST1TEST2TEST3 。 为了简化示例,我省略了private版本。

 public class StaticTest { public static int TEST1 = 1; protected static int TEST2 = 1; static int TEST3 = 1; public static void main(String[] args) { System.out.println("StaticTest.TEST1: " + StaticTest.TEST1); System.out.println("StaticTest.TEST2: " + StaticTest.TEST2); System.out.println("StaticTest.TEST3: " + StaticTest.TEST3); System.out.println("StaticTestSub.TEST1: " + StaticTestSub.TEST1); System.out.println("StaticTestSub.TEST2: " + StaticTestSub.TEST2); System.out.println("StaticTestSub.TEST3: " + StaticTestSub.TEST3); } } public class StaticTestSub extends StaticTest { public static int TEST1 = 2; protected static int TEST2 = 2; static int TEST3 = 2; } 

你可以在家里试试。 出局是:

StaticTest.TEST1:1
StaticTest.TEST2:1
StaticTest.TEST3:1
StaticTestSub.TEST1:2
StaticTestSub.TEST2:2
StaticTestSub.TEST3:2

但是,根据您的具体需求,我推荐Laurence Gonsalves采用的方法