java构造函数中的静态变量初始化
我想从下面的代码y中了解静态变量b的值没有初始化,尽管该值是在构造函数中初始化的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();
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()
;-)就可以测试这些东西