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

时间:2009-09-19 07:55:59

标签: java inheritance static-variables

我希望根据类的类型使用不同的静态变量。

所以我会

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。我希望每种类型都有一个。我想继承静态精灵变量和绘制精灵的绘制函数。但是我不希望Genstealer精灵覆盖Marine精灵。

这可能吗?

我该怎么做?

5 个答案:

答案 0 :(得分:13)

使用抽象方法:

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习惯用法,所以看着他们代码的人不会留下挠头。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

我有一个相同的问题,来到解决方案中使用静态映射

类->对象。

下面的代码示例将Integer用作所需的“类静态”变量的类型。

import java.util.Map;
import java.util.HashMap;

class C
{
    static Map<Class<?>,  Integer> class2IntegerMap = new HashMap<Class<?>, Integer>();


    public void setClassSpecificInteger(Integer _i)
    {
        class2IntegerMap.put(this.getClass(), _i);
    }

    public Integer getClassSpecificInteger()
    {
        return class2IntegerMap.get(this.getClass());    
    }           
}

class CA extends C
{
}

class CB extends C
{
}

class CAA extends CA
{
}

public class MainClass
{
    public static void main(String []args)
    {
        CA a1 = new CA();
        CA a2 = new CA();
        CB b1 = new CB();
        CB b2 = new CB();
        CAA aa1 = new CAA();

        a1.setClassSpecificInteger(Integer.valueOf(-1));
        b1.setClassSpecificInteger(Integer.valueOf(+33));

        System.out.println("The int-value for a1 is: "+a1.getClassSpecificInteger());
        System.out.println("The int-value for b1 is: "+b1.getClassSpecificInteger());

        System.out.println("The int-value for aa1 is: "+aa1.getClassSpecificInteger());

        System.out.println("The int-value for a2 is: "+a2.getClassSpecificInteger());
        System.out.println("The int-value for b2 is: "+b2.getClassSpecificInteger());

        CA a3 = new CA();
        CB b3 = new CB();

        System.out.println("The int-value for a3 is: "+a3.getClassSpecificInteger());
        System.out.println("The int-value for b3 is: "+b3.getClassSpecificInteger());

        CAA aa2 = new CAA();

        aa2.setClassSpecificInteger(Integer.valueOf(8));

        System.out.println("The int-value for aa1 now is: "+aa1.getClassSpecificInteger());
    } 
} 

输出为:

The int-value for a1 is: -1
The int-value for b1 is: 33
The int-value for aa1 is: null
The int-value for a2 is: -1
The int-value for b2 is: 33
The int-value for a3 is: -1
The int-value for b3 is: 33
The int-value for aa1 now is: 8

我希望这对某人有帮助。请客气。

答案 3 :(得分:0)

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

答案 4 :(得分:-1)

快速测试会告诉您,是的,您可以覆盖子类中的静态变量。

我已经整理了一个简单的继承结构来测试它。 StaticTest是StaticTestSub的超级。他们都声明了具有不同访问级别的静态整数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采用的方法