java static field初始化的问题

今天干活时候遇到一个很奇怪的问题。B处的代码始终打印true。

后来发现是private static File file=null这块初始化的问题。将赋值语句去掉或者提到new A()之前,既可以解决

class A{

private static A a=new A();

private static File file=null;

private A(){

file=new File("a");

b.syso()

}

class B {

syso(file==null);

}

}

-----------------

换个直观点的,说明对类的实例化过程还是有迷糊的地方啊。记住1,先初始化赋值,2使用构造参数赋值,3,按照static顺序再初始化赋值。由于使用了static,导致i=5语句在构造函数之后,改变了a=new TestMap()里的值。

如果去掉static,这时候虽然也i=5了,但是在构造函数之前赋值,所以构造函数的赋值i=3生效。

由于static只能初始化一次,因此即使再不停的new TestMap(),i始终是由构造函数赋值。

public class TestMap {
    private static TestMap a = new TestMap();

    private static int i=5;

    private TestMap() {

        i=3;
       new Thread(new Runnable() {
       
        @Override
        public void run() {
            System.out.println(i);
        }
    }).start();
    }

    public static void main(String[] args) throws Exception {
            System.out.println("a");

       
    }

-----------------再加一句-------------

本来是打算写个单例的,顺手把所有东西都写成了static,后来找到一个说法,这种写法有点问题,

你这个所谓单例的用法是不正确的。既然已经把Singleton设为单例,member也就没有必要设为static,这样由于 static member会在non static member面前被初始化,自然就没有这个问题了。同时由于Singleton被设为了单例,也不用担心把member前面的 static去掉会造成空间方面的浪费。

你可能感兴趣的:(java static field初始化的问题)