为什么静态对象作为参数传递给另一个类的构造函数时为 null



我正在用Java制作2D游戏。我有一个精灵类和一个瓷砖类。首先,我在精灵类中声明了一些静态精灵对象

public class Sprite {   
public static Sprite grass = new Sprite(0, 0, Spritesheet.testTiles);
...

然后我在 Tile 类中声明了静态 Tile-对象,并将静态 Sprite 对象作为参数传递,如下所示:

public class Tile {
public static Tile grass = new Tile("grass", Sprite.grass);
...

但是由于某种原因,我传递的精灵为空。知道为什么吗?

每当我在其他地方使用草对象时,我都没有问题。

这完全是意料之中的,静态初始化发生在不同的事件上,这些事件在您分配之前都没有发生,因此静态属性无论如何都是空的。

有关事件的更多详细信息,请参阅此帖子

类装入器如何加载静态变量的说明

事实证明,这是循环依赖的问题。我在 Tile-class 中有一个静态变量 (TILE_SIZE(,我在代码的其他地方使用了它,包括 Sprite 类。我移动了精灵类中的变量,并将依赖项删除为磁贴类。

源语言:

import ge.game.Tile;
public class Sprite {   
public static Sprite grass = new Sprite(0, 0, Spritesheet.testTiles);
...
import ge.graphics.Sprite;
public class Tile {
public static Tile grass = new Tile("grass", Sprite.grass);
public static int TILE_SIZE = 16;
...

新增功能:

public class Sprite {   
public static Sprite grass = new Sprite(0, 0, Spritesheet.testTiles);
public static int SPRITE_SIZE = 16;
...
import ge.graphics.Sprite;
public class Tile {
public static Tile grass = new Tile("grass", Sprite.grass);
...

谢谢!

Tile.grass 字段的初始化早于 Sprite.grass 。下面的问题提供了一些关于它的见解。

Java :静态最终字段初始化的顺序是什么?

对此的解决方案可能是将Sprite.grassTile.grass转换为单例,并通过一种方法访问它们:

class Sprite {   
    private static Sprite grass;
    public static Sprite getGrassInstance(){
       if(grass == null){
           grass = new Sprite(0, 0, Spritesheet.testTiles);
       }
       return grass;
    }
}

但请注意它们之间的循环依赖关系,以避免无限循环。

相关内容

  • 没有找到相关文章

最新更新