Форум программистов CODEBY.NET Хостинг в Беларуси — Active Technologies

Разработка бизнес сайтов

Нужны клиенты? Тогда сюда быстрее...
X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )




> Логические блоки
Louis
Вставить ник
сообщение 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
 
Новая тема 
Ответов (1 - 3)
Yason
Вставить ник
сообщение 6:05:2008, 21:58
Цитата Ответить 


Продвинутый
**

Группа: Программист
Сообщений: 100
Регистрация: 27:02:2004
Пользователь №: 296



Репутация: - 5 +


Возможно, причина в том, что во втором случае ты создаёшь экземпляр класса (при этом инициализируются внутренние не-static поля), а в первом - нет (при этом инициализируются только static поля).
Подняться вверх 
 
Сообщение #2
Louis
Вставить ник
сообщение 7:05:2008, 06:39
Цитата Ответить 


Новенький
*

Группа: Программист
Сообщений: 13
Регистрация: 25:12:2007
Пользователь №: 14 455



Репутация: - 0 +


Цитата(Yason @ 6:05:2008 - 23:58) *
Возможно, причина в том, что во втором случае ты создаёшь экземпляр класса (при этом инициализируются внутренние не-static поля), а в первом - нет (при этом инициализируются только static поля).


возможно...
Подняться вверх 
 
Сообщение #3
Creo
Вставить ник
сообщение 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


Быстрый ответ  Ответить  Новая тема 

> Быстрый ответ
Полужирный
Курсив
Подчеркнутый
Вставить изображение
Смайлики
Цитата
Код
 
 Отправлять уведомления об ответах на e-mail |  Включить смайлики |  Добавить подпись
   

 

RSS Текстовая версия Сейчас: 17:05:2008 - 07:05
с нами можно связаться по:
телефону: +375-(29)-632-60-67
e-mail:info@codeby.net