具有静态属性的Java代码的奇怪行为

具有静态属性的Java代码的奇怪行为,java,static,Java,Static,我真的没什么好问的。见鬼,我甚至不知道这个问题应该说什么。基本上,这段Java代码运行良好,没有任何编译错误 public class Application { static String[][] tiles; public Application() { tiles = new String[9][9]; } public static void main(String[] args) { Application app

我真的没什么好问的。见鬼,我甚至不知道这个问题应该说什么。基本上,这段Java代码运行良好,没有任何编译错误

public class Application {
    static String[][] tiles;

    public Application() {
        tiles = new String[9][9];
    }

    public static void main(String[] args) {

        Application app = new Application();
        Grid mines = new Grid();
        mines.fillTiles(tiles, 9, 9, 10);
    }
}

class Grid {
    Random rand;

    public void fillTiles(String[][] tiles, int rowSize, int colSize,
            int numMines) {
        rand = new Random();
        int rowIndex;
        int columnIndex;
        while (numMines > 0) {
            rowIndex = rand.nextInt(rowSize);
            columnIndex = rand.nextInt(colSize);
            tiles[rowIndex][columnIndex] = "M";
            numMines--;
        }
    }
}
但是,当我移开这条线的时候

Application app = new Application(); 
在第一个类的main方法中,它在

tiles[rowIndex][columnIndex] = new String("M"); 
有什么原因吗

Application app = new Application();
如果不实例化
应用程序
平铺
将指向
null
。对null引用的操作会导致
NullPointerException

数组初始化逻辑位于构造函数中

public Application() {
        tiles = new String[9][9];
    }
构造函数将仅在对象创建时执行(
newapplication()

如果你不想做
Application-app=new-Application()

只需更改
静态字符串[][]tiles=新字符串[9][9]


定义
静态
数组变量并不意味着实例化将在加载时发生。这只意味着该变量是类变量。

您正在实例的构造函数中初始化数组。如果在第一个实例之后创建另一个实例,它将重新初始化静态成员。

您注意到您已经在构造函数中实例化了数组吗

static String[][] tiles;

public Application() {
    tiles = new String[9][9];  <--- Here
}


如果在构造函数中初始化数组,则每次创建实例时,都会对每个实例重新初始化数组。由于
静态
变量对所有实例都是通用的。因此,对
静态变量所做的更改将反映在所有实例中。

因为您正在初始化
tiles=new String[9][9]代码。只有在使用
new
将对象实例创建为
new Application()
时,才会调用构造函数

如果不想使用构造函数,请将初始化为的静态变量声明为:

    static String[][] tiles = new String[9][9];

如果没有构造函数调用,应该可以正常工作。

我想我可能知道原因:

public class Application {
    static String[][] tiles;

    public Application() {
        tiles = new String[9][9];
    }

    public static void main(String[] args) {

        Application app = new Application();
        Grid mines = new Grid();
        mines.fillTiles(tiles, 9, 9, 10);
    }
}
在这里,您有一个静态2d数组,其中包含名为tiles的字符串。但是,您只能在应用程序的构造函数中初始化它。因此,当调用“mines.fillTiles(tiles)”时,tiles仍然为空且

tiles[rowIndex][columnIndex] = new String("M"); 
将引发NullPointerException。

否,他正在构造函数中初始化数组。它在类范围中声明(如果它是静态变量,则必须声明)。
public class Application {
    static String[][] tiles;

    public Application() {
        tiles = new String[9][9];
    }

    public static void main(String[] args) {

        Application app = new Application();
        Grid mines = new Grid();
        mines.fillTiles(tiles, 9, 9, 10);
    }
}
tiles[rowIndex][columnIndex] = new String("M");