2016-03-09 14 views
4

У меня есть следующий фрагмент кода:Можно ли инициализировать статическую переменную внутри конструктора?

class Constructor { 

    static String str; 

    public void Constructor() { 
     System.out.println("In constructor"); 
     str = "Hello World"; 
    } 

    public static void main(String[] args) { 
     Constructor c=new Constructor(); 
     System.out.println(str); 
    } 
} 

Его выход является нулевым, даже если строка инициализации в конструкторе.

Почему это так?

+2

общественности недействительным Constructor() {не является конструктором, его обычный метод – SpringLearner

+3

Что касается вашего вопроса: вы можете, но вы не должны. Это очень плохой стиль. –

+1

Но, на мой взгляд, не имеет смысла хотеть инициализировать статическую переменную внутри конструктора? Статическая переменная может быть доступна без объекта, поэтому переменная не должна быть статической, если вам нужно инициализировать конструктор. – user16655

ответ

4

Как я уже говорил в комментариях public void Constructor(){ не является конструктором, так как конструкторы не имеют возвращения type.As ваш Constructor имеет юридической силы, так его не конструктор

Удалить пустота ключевое слово

class Constructor { 

static String str; 

public Constructor(){ 
    System.out.println("In constructor"); 
    str="Hello World"; 
} 

public static void main(String[] args) { 
    Constructor c=new Constructor(); 

    System.out.println(str); 

} 


} 

выход: Hello World

+0

Большое спасибо за разъяснение – abhi1489

+0

@ abhi1489 Добро пожаловать. Вы можете принять одно из решений, которые, по вашему мнению, вам помогли. – user3437460

9

public void Constructor() не является конструктором .. это недействительный метод. Если удалить void, он должен работать, как предполагалось

1

у меня есть следующий фрагмент кода, выход которого является NUL л, даже если строка инициализируются внутри конструктора

конструктора не имеет типа возвращаемого значения. Ваш текущий так называемый конструктор поставляется с возвращаемым типом void, следовательно, это уже не конструктор, а метод вашего класса.

Попробуйте снова:

public Constructor(){ //void removed 
    System.out.println("In constructor"); 
    str="Hello World"; 
} 
+0

Спасибо за помощь – abhi1489

1

Также в качестве побочного сведению: вы можете использовать статический-блок для инициализации статических переменных. В вашем случае, как так:

static { 
    str="Hello World"; 
} 

Это означает, что вы только инициализировать переменную один раз, а не каждый раз, когда конструктор выполняется.

0

Да, вы можете. Но вы не должны.

Позвольте мне подробно остановиться на нем.

Когда вы инициализируете его значение внутри конструктора; вы на самом деле присваиваете ему какую-то ценность. Это всегда будет назначаться всякий раз, когда вы создаете объект своего класса (что вы не то, что вы намеревались сделать, когда считаете правильным инициализировать элемент статических данных).

Здесь статические блоки спасают нас.

Статические блоки выполняются всякий раз, когда класс загружается в память с помощью JVM. Следовательно, как только ваш класс загружен, любые назначения, которые вы определили внутри вашего статического блока, происходят в первый и последний раз, пока ваш класс не будет в памяти.

Следовательно, его идеал использовать статические инициализаторы всегда для инициализации статических элементов данных.

В вашем случае ввести ниже фрагмент кода внутри класса

static { 
    str = "Hello World"; 
} 
Смежные вопросы