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
不,如果您只调用类的静态方法,则构造函数不会运行.没有与静态方法调用相关联的类的实例.这就是为什么mapSprites是null.
要填充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,并且此类的实例现在是无用的.
| 归档时间: |
|
| 查看次数: |
7684 次 |
| 最近记录: |