2014-08-29 6 views
0
package ali; 

public class test { 
public static int n = 99; 

public static test t1 = new test("t1"); 
public static test t2 = new test("t2"); 

public static int i = 0; 
public static int j = i; 
{ 
    System.out.println("construct block"); 
} 

static { 
    System.out.println("static construct block"); 
} 

public test(String str){ 
    System.out.println((++j) + ":" + " i="+ i + " n="+n+str); 
    n++;i++; 
} 

public static void main(String [] args){ 
    test test1 = new test("initl"); 
} 
} 

после запуска:java класс инициализирует заказ, как он работает?

construct block 
1: i=0 n=99t1 
construct block 
2: i=1 n=100t2 
static construct block 
construct block 
1: i=0 n=101initl 

Кто может сказать мне, как это работает? Почему нет «статического блока конструкции» при создании t1 и t2? Почему i и j изменились на значение по умолчанию, но n все еще не изменилось?

+0

Возможный дубликат [Создание объекта с использованием статического ключевого слова в Java] (http://stackoverflow.com/questions/24927401/creating-object-using-static-keyword-in-java) –

ответ

5

Статические переменные/блоки выполняются/инициализируются по мере их появления (обычно).

Ваш выход и почему? :

Когда класс загружен и во время его инициализации, следующие строки будут выполнены

public static test t1 = new test("t1"); 
public static test t2 = new test("t2"); 

, который в свою очередь, создают новые объекты Test, но так как класс уже при инициализации, выше линии снова не выполняются.

Так,

вы получите

construct block 
1: i=0 n=99t1 
construct block 
2: i=1 n=100t2 

Далее, статический блок выполняет

static construct block 

Теперь, когда вы создаете объект испытаний в main(), вы будете иметь

construct block 
1: i=0 n=101initl 
+0

Я знаю ваше среднее, первое время t1 было создано, – zawdd

+0

public static int i = 0; public static int j = i; будет выполняться, а при создании t2 две строки не будут выполняться снова. но почему, когда test1 создает эти две строки, выполненные снова? (причина, по которой i и j меняются на значение по умолчанию) Это то, что я не понимаю. – zawdd

+0

Строки 'public static int' не выполняются, когда t1 или t2 создаются вообще. Поскольку они являются статическими, они выполняются, когда загружается файл класса. Статические поля и методы вообще не связаны с объектными экземплярами и не должны быть связаны ни с чем, как «при создании экземпляра». – Korashen

2

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

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