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

时间:2017-05-20 11:14:08

标签: java object static null

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

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);
...

但是由于某种原因,Sprite I' m传递为null。有什么想法吗?

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

3 个答案:

答案 0 :(得分:2)

完全可以预料到,静态初始化发生在不同的事件上,在分配之前它们都不会发生,因此静态属性无论如何都将为null。

有关活动的更多详情,请参阅此帖子

Explanation of how classloader loads static variables

答案 1 :(得分:0)

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

Java : in what order are static final fields initialized?

解决方法可能是将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;
    }

}

但要注意它们之间的周期性依赖关系以避免无限循环。

答案 2 :(得分:0)

结果证明是循环依赖的问题。我在Tile类中有一个静态变量(TILE_SIZE),我在代码的其他地方使用过它,包括Sprite类。我在Sprite类中移动了变量,并将依赖项移除到了Tile-class。

原:

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);
...

谢谢!