2014-08-29 3 views
1

мы знаем, что ...Инициализация класса переменных в конструкторе в Java

Instance Variable инициализируются в конструкторе по умолчанию. Напр.

public class H{ 
    int x; 

    public static void main(String... args){ 
     System.out.print(new H().x); 
    } 
} 

O/P указанного кода потому что конструктор по умолчанию, который вызывается, и конструктор инициализации х 0.

Теперь мой вопрос, если мы запустите следующий код, т.е.

public class H{ 
     int x; 

     public H(){} 

     public static void main(String... args){ 
      System.out.print(new H().x); 
     } 
} 

фактическая O/P является в этом случае, но я думаю, что должна быть ошибка компилятора, что х не инициализируется, потому что мы имеем о verride конструктор по умолчанию и не инициализировал x.I думаю, что я сделал свой вопрос ясным.

+2

переменные экземпляра инициализируются значениями по умолчанию в соответствии с их типами. – Adi

+0

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

+1

Инициализация поля происходит до вызова конструктора. –

ответ

5

В Java членов экземпляров по умолчанию для всех бит-офф версии автоматически их значения (int s являются 0, ссылки на объекты являются null, floats: 0.0, booleans - false и т. Д.). Это не то, что делает конструктор по умолчанию, это делается перед конструктор работает.

Заказ:

  1. По умолчанию члены экземпляра, чтобы их все-бит-офф значения. (оптимизатор может пропустить это, если он видит # 2 ниже или возможно, если он может доказать себе, что ничто не использует элемент до инициализации в # 3 ниже.)

  2. Применить любую встроенную инициализацию них , Например:

    int a = 42; 
    
  3. Применить блоки инициализации экземпляра в порядке исходного кода.

  4. Вызвать соответствующий конструктор.

Так, например:

class Example { 

    int a = 42; 

    // Instance initializer block: 
    { 
     this.a = 67; 
    } 

    Example() { 
     System.out.println(this.a); 
    } 
} 

new Example() выходы 67.

Очевидно, что инициализация в обоих местах, как это было бы плохой практикой, это просто для иллюстрации.

8

По умолчанию в java инициализируются нефинальные поля. По умолчанию не инициализируются только переменные внутри методов и конечных полей.

Если вы объявили x окончательным, тогда вы были бы правы. У вас будет ошибка компиляции кода.

2

переменных экземпляр имеет значение по умолчанию, связанное с ними

Значения по умолчанию: Это не всегда необходимо, чтобы присвоить значение, когда поле объявлено. Поля, объявленные, но не инициализированные, будут установлены на разумный по умолчанию компилятор. Вообще говоря, это значение по умолчанию будет равен нулю или нулевой, в зависимости от типа данных

+0

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

+0

хорошо этот [документ] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html) говорит, что они инициализируются компилятором – SparkOn

+0

Интересно. Похоже, вы совершенно правы. Они могут храниться в таблицах инициализации в файле класса, а не непосредственно в байт-кодах. Я бы подумал иначе. +1 для урока. –

3

Все переменные уровня экземпляра инициализируются значениями по умолчанию, независимо от того, был ли перегружен конструктор (или добавлен конструктор с явным конструктором без аргументов). Конструктор просто изменяет значения (значения) по умолчанию.

1

Java довольно опрятен программистам (в отличие от других, например, C), это означает, что он автоматически инициализирует поля. Исключением являются конечные поля и поля внутри методов (когда компилятор затем произведет ошибку).

Надеюсь, это помогло.

+0

Что значит «поля внутри методов» ?. Вы знаете, что есть еще несколько ответов. Вы должны подробнее рассказать о своих мыслях и предложить примеры и различные перспективы для ответа, прежде всего, если вы хотите увеличить количество оборотов. Я бы подумал о том, чтобы вы продвигали вас, если вы уточняете больше. –

+0

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

Смежные вопросы