Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java构造函数中的静态变量初始化_Java_Static_Constructor - Fatal编程技术网

java构造函数中的静态变量初始化

java构造函数中的静态变量初始化,java,static,constructor,Java,Static,Constructor,我想从下面的代码y中了解静态变量b的值没有初始化,尽管该值是在构造函数中初始化的 public class A { private static B b = null; public A() { if (b == null) b = new B(); } public static void main(String[] args) { b.func();

我想从下面的代码y中了解静态变量b的值没有初始化,尽管该值是在构造函数中初始化的

public class A {
       private static B b = null;
       public A() {
           if (b == null)
             b = new B();
       }

       public static void main(String[] args) {
           b.func();
       }
    }
谢谢
布尼思错了-这样做:

public class A {
       private static B b = null;

       static {
             b = new B();
       }

       public A() {
       }

       public static void main(String[] args) {
           b.func();
       }
    }
您从不调用A()构造函数。 main函数是静态的,这意味着它不“属于”A的实例。 因此,当您输入main时,没有创建A的实例,因此从未调用过构造函数,而b仍然为null

如果运行此代码,应该会得到NullPointerException

如果你加上 新A();
在b.func()之前;然后你就会没事了(代码仍然会很奇怪)

你的问题是为了帮助你“理解”为什么会有这样的行为。原因是调用静态方法
main()
时未调用类A的构造函数

如果要实例化类型为
A
的对象,则将调用构造函数并初始化对
B
的引用

我建议在从
static void main()
执行类之前,始终实例化一个类,这是一个很好的实践。如果您开始使用框架(例如Spring),那么最好创建类的实例,而不是编写类似于编写过程代码的静态方法

一个解决方案,不诉诸静态初始化和遵循的原则概述,这里,是

public class A {
    private static B b = null;

    public A() {
        if (b == null)
          b = new B();
    }

    public static void main(String[] args) {
        A a = new A();
        a.callFunc();
    }

    public void callFunc() {
        b.func();
    }
}

正如您所见,您需要一种方法来引用
b.func()方法
,因此我添加了一个
a.callFunc()
,出于这个原因

我认为您的问题有两个部分:

1) 为什么静态变量b的值没有初始化 该值已在构造函数中初始化

Ans:首先,在main()之前没有调用构造函数。构造函数在main()中被调用。无论何时在main()中使用
new
作为:

public static void main(String args[]){
MyClass myclass= new MyClass()
}
然后只调用构造函数

在您的代码中,静态变量b未初始化,因为您正在构造函数A()中初始化它,但从未调用过此构造函数。您可以在代码中调用()构造函数,如下所示:

public static void main(String[] args) {
          A a=new A(); // constructor gets called here.
           b.func();
       }
2) 初始化静态变量的正确方法是什么

初始化静态变量的正确方法是使用静态初始化块,而不是在构造函数中初始化它们,如上面duffymo给出的答案所示

static {
  b = new B();
 }
您还可以使用:

public class A {
       private static B b = new B();

       public A() {
       }

       public static void main(String[] args) {
           b.func();
       }
    }

因为您已经使
b
的初始化依赖于
A
实例的创建。如果您能详细说明为什么在发布的OP中这样做是错误的,我相信它的可能副本会更有用。但这在语义上是不同的,对吗?在OP发布的代码中,除非一个对象被实际分割,否则字段不会初始化。伙计们,我想知道在调用main方法之前,构造函数将被调用。所以对象将被初始化。或者上面的语句是假的??构造函数是为实例而不是静态变量调用的。不,构造函数在
main()
之前没有被调用,顺便说一句,您只需添加
System.out.println()
;-)就可以测试这些东西