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

标签 java constructor static scope static-methods

我有一个名为 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);
}

最佳答案

不,如果你只调用一个类的静态方法,构造函数不会运行。没有类的实例与对静态方法的调用相关联。这就是 mapSpritesnull 的原因。

要填充 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/

相关文章:

object - 在需要构建的对象中设置字段

c++ - 构造函数继承和直接成员初始化

c# - 在构造函数中调用异步方法?

c# - Microsoft 如何决定在 C# 中将方法设为静态/成员?

c - 如何添加静态断言来检查变量是否是静态的?

java - Java中静态 block 的执行

java - android 5.0.1 sdk 包适用于 android 5.0.4 吗?

java - 使用工作线程时返回语句

java - 按字母顺序排序后,如何获取列表中最重复值的计数?

java - String.subString() 和 String.subSequence() 有什么区别