如果我调用静态方法,构造函数是否运行

Dom*_*ore 3 java static constructor static-methods scope

我有一个Tile用静态方法调用public static BufferedImage grass()的类,在类中也是一个public Tile()设置变量的构造函数.

所以我想知道的是,如果我grass()从另一个类调用该方法Tile.grass(),构造函数会运行吗?

我假设没有,因为我的grass()方法正在返回null.

这是我的代码:

import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Tile {

    public static final int size = 50;

    private static BufferedImage mapSprites;

    public Tile(){
        try{
            Tile.setMapSprites(ImageIO.read(getClass().getResource("res/mas.png")));
        } catch (IOException e){
            e.printStackTrace();
        }
    }

    public static BufferedImage grass(){
        return getMapSprites().getSubimage(0, 0, 10, 10);;
    }

    private static BufferedImage getMapSprites() {
        return mapSprites;
    }

    private static void setMapSprites(BufferedImage mapSprites) {
        Tile.mapSprites = mapSprites;
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以创建一个函数来获取mapSprite我返回的每个tile.但我认为这不会非常有效.还有其他解决方案吗?

(这里仅供参考,我在Map课堂上如何称呼它)

public void render(){
    g.drawImage(Tile.grass(), 0, 0, null);
}
Run Code Online (Sandbox Code Playgroud)

rge*_*man 13

不,如果您只调用类的静态方法,则构造函数不会运行.没有与静态方法调用相关联的类的实例.这就是为什么mapSpritesnull.

要填充mapSprites,您可以将初始化它的代码移出构造函数并移动到静态初始化程序中.这样,它将在第一次引用类时运行,以便在第一次mapSprites调用static方法时正确初始化.

static {
    try{
        Tile.setMapSprites(ImageIO.read(Tile.class.getResource("res/mas.png")));
    } catch (IOException e){
        e.printStackTrace();
    }
}
Run Code Online (Sandbox Code Playgroud)

使用静态初始化程序时,必须小心避免任何异常传播.如果确实如此,那么它将被包裹在一个ExceptionInInitializerError将被抛出的内容中,这对您的程序来说将是个坏消息.

您可能还想创建(现在无用的)构造函数private,以防止类的实例化,因为您的类现在是一个实用程序类,其中一切都是static,并且此类的实例现在是无用的.