我想从下面的代码中理解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
答案 0 :(得分:7)
错了 - 这样做:
public class A {
private static B b = null;
static {
b = new B();
}
public A() {
}
public static void main(String[] args) {
b.func();
}
}
答案 1 :(得分:6)
你永远不会调用A()构造函数。 main函数是静态的,这意味着它不属于A的实例。 所以当你输入main时,没有创建A的实例,所以从未调用过构造函数,而b仍然是null。
如果运行此代码,则应该获得NullPointerException。
如果你添加 新的A(); 在b.func()之前;然后你会好的(代码仍然是奇怪的)
答案 2 :(得分:3)
我认为你的问题有两部分:
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();
}
}
答案 3 :(得分:2)
你的问题要求帮助你“理解为什么”这种行为是这样的。原因是当您调用静态方法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()