繁体   English   中英

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

[英]Static variable initialization in Constructor java

我想从下面的代码中理解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();
       }
    }

谢谢Punith

错了 - 这样做:

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()之前; 然后你会没事的(代码仍然是奇怪的)

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

1)为什么静态变量b的值没有初始化,虽然值是在构造函数中初始化的?

Ans:首先,在main()之前没有调用构造函数。 构造函数在main()中调用。 每当在main()中你使用new作为:

public static void main(String args[]){
MyClass myclass= new MyClass()
}

然后只调用构造函数。

在你的代码中,静态变量b没有被初始化becoz你正在构造函数A()中初始化它,但是这个构造函数从未被调用过。 您可以在代码中调用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();
       }
    }

您的问题要求帮助您“理解为什么”这样的行为。 原因是当您调用静态方法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() method因此我a.callFunc()添加了a.callFunc()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM