2012-05-09 2 views
2

Я хочу понять из приведенного ниже кода y значение статической переменной b не было инициализировано и хотя значение было инициализировано в конструкторе.Статическая инициализация переменных в конструкторе java

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

+2

Поскольку вы сделали инициализацию 'b' зависит от создания экземпляра' Ā'. – user1329572

+0

Возможный дубликат [статическая инициализация инициализации java] (http://stackoverflow.com/questions/1642347/static-variable-initialization-java) – nandeesh

ответ

6

Вы никогда не вызвать конструктор A(). Основная функция является статической, это означает, что она не «принадлежит» экземпляру A. Итак, когда вы входите в main, экземпляр A не создан, поэтому конструктор никогда не был вызван, а b все равно null.

Вы должны получить исключение NullPointerException, если вы запустите этот код.

Если вы хотите добавить новый A(); перед b.func(); то вы будете в порядке (код по-прежнему будет нечетным)

+0

yep получил это ... спасибо –

7

Wrong - это сделать так:

public class A { 
     private static B b = null; 

     static { 
      b = new B(); 
     } 

     public A() { 
     } 

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

Было бы более полезно, я уверен, если бы вы могли уточнить, почему это неправильно делать это в OP. – posdef

+2

Но это семантически отличается, правда? В коде, опубликованном OP, поле не инициализируется, если объект фактически не зацикливается. – aioobe

+0

Ребята, я хочу знать, что до вызова основного метода будет вызван конструктор. поэтому объект будет инициализирован. или это утверждение выше false? –

2

Ваш вопрос попросил помочь вам «понять, почему» поведение было таким, каким оно было. Причина в том, что конструктор класса 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() по этой причине

3

Я думаю, что ваш вопрос состоит из двух частей:

1) Почему значение статической переменной б не был инициализирован и хотя значение было инициализировано в конструкторе?

Ans: Первое, что конструктор не вызывается перед 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(); 
     } 
    } 
Смежные вопросы