2014-02-21 5 views
10

Я изучаю экзамен по Java. Пока я учился, я встречал синтаксисы в java, которые мне незнакомы. Такие, как фигурные скобки ({}) без тела класса без имени, у некоторых есть статическое ключевое слово. Я узнал, что они называются «Инициализаторы». Может ли кто-нибудь помочь мне указать на основные различия между ними и то, как они отличаются от конструктора. СпасибоСтатические инициализаторы против Instance Инициализаторы против конструкторов

+0

Я рекомендую вам эту книгу http://www.apress.com/9781430247647 главы 3 и 4 – Leo

+0

@Reieus он также спросил об анонимных блоках кода – jeremyjjbrown

ответ

20

Главное отличие между ними - порядок, в котором они выполняются. Чтобы проиллюстрировать это, я объясню им пример:

public class SomeTest { 

    static int staticVariable; 
    int instanceVariable;   

    // Static initialization block: 
    static { 
     System.out.println("Static initialization."); 
     staticVariable = 5; 
    } 

    // Instance initialization block: 
    { 
     System.out.println("Instance initialization."); 
     instanceVariable = 10; 
    } 

    // Constructor 
    public SomeTest() { 
     System.out.println("Constructor executed."); 
    } 

    public static void main(String[] args) { 
     new SomeTest(); 
     new SomeTest(); 
    } 
} 

Выход будет:

Static initalization. 
Instance initialization. 
Constructor executed. 
Instance initialization. 
Constructor executed. 

Кратко говорить:

  • Статические блоки инициализации выполняются один раз класс загружается JVM.
  • Блоки инициализации экземпляра запускаются перед конструктором при каждом экземпляре объекта.
  • Конструктор (очевидно) запускается каждый раз при создании объекта.
+7

Это хороший ответ. Но я хотел бы добавить, что конструкторы гораздо более распространены, чем инициализаторы экземпляров. Я думаю, что основной пример использования, например, инициализаторы, предназначен для инициализации в анонимных внутренних классах, которые не могут иметь конструкторов, потому что им не хватает имен. –

+0

очень простой и приятный пример +1 –

1

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

Статические инициализаторы полезны для выполнения кода установки в статических классах и заполнения структур данных в Enums. Они вызываются один раз, по порядку сверху вниз, когда класс загружается в JVM, и данные существуют в пределах класса Class или Enum. Все ссылки на класс возвращают одно и то же значение для полей, инициализированных в статических инициализаторах

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

+0

«Безмерные фигурные скобки» называются [инициализаторами экземпляра] (http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.6) –

0

Это то, что вам действительно нужно посмотреть в учебнике, чтобы получить ответ. Однако я могу дать вам несколько указателей. Прошло несколько лет с тех пор, как я запрограммировал Java, поэтому любая информация, которую я вам дал, является общей.

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

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