Java 静态字段初始化

标签 java initialization static-methods

我刚刚花了半个小时弄清楚这件事,我已经设法修复了我的代码,但我不完全理解发生了什么,想知道是否有人可以阐明它。

我有一个 utils 类型类,它包含一些静态字段(例如数据库连接端点),根据手头的任务,这些字段会被其他各种程序使用。本质上是一个图书馆。

这是它以前的样子(虽然还是坏了);

//DBUtils.java
public final class DBUtils {

    private static DBConnection myDBConnection = spawnDBConnection();
    private static DBIndex myDBIndex = null;

    private static DBConnection spawnDBConnection() {
        //connect to the database
        //assign a value to myDBIndex (by calling a method on the DBConnection object) <- IMPORTANT
        //myDbIndex NOT NULL HERE
        System.out.println("database connection completed");
        //return the DBConnection object
    }

    public static searchDB(String name) {
        //use the myDBIndex to find a row and return it
    }
}

简单地说,我使用静态 spawnDBConnection() 方法为 myDBConnectionmyDBIndex 赋值。这非常有效,我程序的第一行输出始终是“数据库连接已完成”,在 spawnDBConnection() 方法结束时 myDBConnection 或 myDBIndex 都不为空,一切都应该如此。

我的外部程序是这样的;

//DoSomethingUsefulWithTheDatabase.java
public final class DoSomethingUsefulWithTheDatabase {

    public static void main(String args[]) {
        DBUtils.searchDB("John Smith"); //fails with NullPointerException on myDBIndex!
    }
}

这个对 searchDB 的调用发生在 spawnDBConnection 完成之后,我已经广泛使用标准输出来展示这一点。但是,一旦进入 searchDB 方法,myDBIndex 的值为空!它是一个静态字段,在 spawnDBConnection 结束时它不是 null,没有进行其他分配,现在它是 null :(

简单的修复是删除“= null”,这样字段声明现在看起来像这样;

private static DBIndex myDBIndex;

为什么会有所不同?我对此感到非常困惑。

最佳答案

那是因为nullmyDBIndex的赋值是在

之后完成的
private static DBConnection myDBConnection = spawnDBConnection();

例如覆盖 spawnDBConnection

中的赋值

顺序是:

  1. 声明字段myDBConnectionmyDBIndex
  2. 初始化myDBConnection = spawnDBConnection();

    其中包括调用 spawnDBConnection 并将返回值赋给 myDBConnection

  3. 初始化myDBIndex(为空)

在你的第二个例子中,第三步不存在。

关于Java 静态字段初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11631216/

相关文章:

java - 如何获取请求参数 "j_username"和 "j_password"的值?

C 字符串初始化。可能的麻烦

c++ - GCC 4.7 从初始化器列表初始化 unique_ptrs 容器失败

c++ - 静态函数的问题,g++ 说该类尚未声明

ios - swift中静态函数和单例类的区别

java - 下面的语句编译成功,为什么?

java - 从 java jar 文件加载文件

java - Java 8 中特殊 lambda 表达式的最短表示法

c++ - 对象删除 : use parent or not

java - 编译错误相关