Ваш вопрос попросил помочь вам «понять, почему» поведение было таким, каким оно было. Причина в том, что конструктор класса A не вызывается при вызове статического метода main()
.
Если вы хотите создать экземпляр объекта типа 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()
по этой причине
Поскольку вы сделали инициализацию 'b' зависит от создания экземпляра' Ā'. – user1329572
Возможный дубликат [статическая инициализация инициализации java] (http://stackoverflow.com/questions/1642347/static-variable-initialization-java) – nandeesh