Помощник
Здравствуйте, гость ( Вход | Регистрация )
|
|
6:05:2008, 16:20
|
|
Новенький ![]() Группа: Программист Сообщений: 13 Регистрация: 25:12:2007 Пользователь №: 14 455 Репутация: 0
|
есть два примера :
Пример 1: Код public class Quest5{ {System.out.print("1");} static {System.out.print("2");} Quest5(){System.out.print("3");} public static void main(String [] args){ System.out.print("4"); } } При запуске на экране имеем - 24 Пример 2: Код class Department { { System.out.println("logic (1) id="); } static { System.out.println("static logic"); } private int id = 7; public Department(int d) { id = d; System.out.println("конструктор id=" + id); } int getId() { return id; } { id = 10; System.out.println("logic (2) id=" + id); } } public class DemoLogic { public static void main(String[] args) { Department obj = new Department(71); System.out.println("значение id=" + obj.getId()); } } При запуске получаем : static logic logc(1) id=0 logc(2) id=10 конструктор id=71 значение id=71 Вопрос: Почему в первом варинте выводится только статический логический болок а нестатический не выводиться?? а во втором примере выводятся оба? Сообщение отредактировал Louis - 6:05:2008, 19:36 |
|
Сообщение
#1
|
|
![]() |
|
|
6:05:2008, 21:58
|
|
Продвинутый ![]() ![]() Группа: Программист Сообщений: 100 Регистрация: 27:02:2004 Пользователь №: 296 Репутация: 5
|
Возможно, причина в том, что во втором случае ты создаёшь экземпляр класса (при этом инициализируются внутренние не-static поля), а в первом - нет (при этом инициализируются только static поля).
|
|
Сообщение
#2
|
|
|
|
7:05:2008, 06:39
|
|
Новенький ![]() Группа: Программист Сообщений: 13 Регистрация: 25:12:2007 Пользователь №: 14 455 Репутация: 0
|
|
|
Сообщение
#3
|
|
|
|
13:05:2008, 11:33
|
|
Новенький ![]() Группа: Программист Сообщений: 34 Регистрация: 2:11:2006 Пользователь №: 7 523 Репутация: 0
|
Цитата Почему в первом варинте выводится только статический логический болок а нестатический не выводиться?? а во втором примере выводятся оба? Это связанно с работай виртуальной машины. В первом примере в виртуальную машину загружается класс(не путать с созданием экземпляра). При этом инициализируются сначала статические блоки, потом статические поля(что бы была возможность делать вызовы типа ClassName.field ClassName.method() ) при этом не создаётся экземпляр класса, соответственно конструктор не срабатывает... Во втором варианте все еще более "запущено" При обращении к классу инициализируются статик блоки, потом статик поля, потом блоки инициализации,т.е. то что между такими {} кавычками, причем в порядке их следование в коде, т.е. сначала logc(1) id=0 потом logc(2) id=10. Потом уже вызывается констуктор, так как в этом примере экземпляр класса создаётся.... |
|
Сообщение
#4
|
|
![]() |
|
Текстовая версия | Сейчас: 17:05:2008 - 07:05 |