我有一个名为 Tile
的类,它有一个静态方法 public static BufferedImage grass()
并且在类内部还有一个构造函数 public Tile()
设置一个变量。
所以我想知道的是,如果我从另一个类 Tile.grass()
调用 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;
}
}
我可以创建一个函数,为我返回的每个图 block 获取 mapSprite
。但我认为这不会非常有效。还有其他解决方案吗?
(仅供引用,我是如何在我的 Map
类中调用它的)
public void render(){
g.drawImage(Tile.grass(), 0, 0, null);
}
最佳答案
不,如果你只调用一个类的静态方法,构造函数不会运行。没有类的实例与对静态方法的调用相关联。这就是 mapSprites
为 null
的原因。
要填充 mapSprites
,您可以将初始化它的代码从构造函数中移出并移到静态初始化程序中。这样,它会在第一次引用该类时运行,因此当您第一次调用 static
方法时,mapSprites
会正确初始化。
static {
try{
Tile.setMapSprites(ImageIO.read(Tile.class.getResource("res/mas.png")));
} catch (IOException e){
e.printStackTrace();
}
}
对于静态初始值设定项,您必须小心避免从中传播任何异常。如果是,那么它将被包装在将被抛出的 ExceptionInInitializerError
中,这对您的程序来说是个坏消息。
您可能还想使(现在无用的)构造函数私有(private)
,以防止类的实例化,因为您的类现在是一个实用类,其中所有内容都是静态的
>,并且此类的实例现在无用。
关于java - 如果我调用静态方法,构造函数是否运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30308669/