Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 138
1

Инициализация полей класса

23.09.2017, 12:59. Просмотров 1486. Ответов 8
Метки нет (Все метки)


Всем привет.

Задумался над следующим вопросом.

Допустим есть такой класс Singleton:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Manager {
 
   private String field;
 
   private static Manager instance;
 
   // Singleton
    public synchronized static Manager getInstance(){
        if(instance==null){
            instance=new Manager();
        }
        return instance;
    }
 
}
Я обращаюсь к этому классу из разных классов и разных потоков. Когда произойдёт инициализация статик поля, а когда нестатичного? Насколько я понимаю оба поля инициализируются при вызове Manager.getInstance()? Если я обращусь через конструктор Manager() также будет инициализировано оба поля? Если с инициализацией статик более менее понятно, то вот в каких случаях будет инициализироваться поле field и как часто не совсем ясно? Например, в другом потоке при вызове Manager.getInstance() или Manager() будет происходить инициализация field? А если класс не синглетон, то как идёт инициализация, есть ли отличие?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.09.2017, 12:59
Ответы с готовыми решениями:

Инициализация полей класса конструктором
Добрый день! возникла такая проблема. Необходимо создать класс Polygon, в котором создать...

Инициализация полей до выполнения тела конструктора
Добрый день. Решил написать программку по вычислению площади, периметра треугольника; проверки его...

Инициализация класса
public class Quest5 { {System.out.print("1");} static{System.out.print("2");}...

Инициализация класса по имени
Допустим у меня есть базовый класс A, и 100 подклассов с другими именами Я бы хотел вывести...

8
2971 / 2513 / 778
Регистрация: 05.07.2013
Сообщений: 12,169
23.09.2017, 14:12 2
так как конструктор не приватный, это не синглтон, очевидно
0
3276 / 2338 / 425
Регистрация: 28.04.2012
Сообщений: 7,823
23.09.2017, 21:17 3
Цитата Сообщение от Delphian Посмотреть сообщение
Я обращаюсь к этому классу из разных классов и разных потоков. Когда произойдёт инициализация статик поля, а когда нестатичного? Насколько я понимаю оба поля инициализируются при вызове Manager.getInstance()? Если я обращусь через конструктор Manager() также будет инициализировано оба поля? Если с инициализацией статик более менее понятно, то вот в каких случаях будет инициализироваться поле field и как часто не совсем ясно? Например, в другом потоке при вызове Manager.getInstance() или Manager() будет происходить инициализация field? А если класс не синглетон, то как идёт инициализация, есть ли отличие?
Почитай Java Memory Model, например.
0
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 138
25.09.2017, 10:40  [ТС] 4
xoraxax, да забыл добавить приватный конструктор, но суть вопроса не меняется, пытаюсь понять как работает инициализация

Добавлено через 57 секунд
korvin_, спасибо, посмотрю, что есть на эту тему
0
2971 / 2513 / 778
Регистрация: 05.07.2013
Сообщений: 12,169
25.09.2017, 11:34 5
Цитата Сообщение от Delphian Посмотреть сообщение
суть вопроса не меняется
суть как раз таки меняется
1
524 / 260 / 69
Регистрация: 11.12.2016
Сообщений: 1,223
25.09.2017, 13:35 6
Delphian,
Обычно сначала инициализируются static ( поля класса) а потом остальное (поля объекта).
Сначала создается объект а потом инициализируются его поля.
Если это синглтон, значит конструктор private значит вы просто так его не вызовете.
Если поле static (поле класса) то оно общее для всего класса, а не статик у каждого объекта свое, но фишка синглтона что может быть только 1 объект!
2
153 / 145 / 46
Регистрация: 21.10.2016
Сообщений: 293
25.09.2017, 13:41 7
Лучший ответ Сообщение было отмечено Delphian как решение

Решение

Цитата Сообщение от Delphian Посмотреть сообщение
Когда произойдёт инициализация статик поля, а когда нестатичного?
Статик поле будет инициализировано при загрузке класса значением null.
При первом вызове метода getInstance() будет создан объект класса Manager, его нестатичному полю будет присвоено значение null.
Указатель на этот объект будет присвоен статик полю.
При повторных вызовах будет возвращаться указатель на этот объект.

Цитата Сообщение от Delphian Посмотреть сообщение
Если я обращусь через конструктор Manager() также будет инициализировано оба поля?
Если конструктор приватный, не обратишься.
0
0 / 0 / 0
Регистрация: 14.08.2012
Сообщений: 138
25.09.2017, 14:42  [ТС] 8
ViktorFX, Хм, спасибо за ответы. А если речь не идёт о синглтоне, то в какой момент будет инициализация статик поля, когда создаётся первый объект класса или всё-таки раньше?
0
153 / 145 / 46
Регистрация: 21.10.2016
Сообщений: 293
25.09.2017, 14:48 9
Цитата Сообщение от Delphian Посмотреть сообщение
или всё-таки раньше?
Да. До создания первого объекта.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.09.2017, 14:48

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Загрузка и инициализация класса
Доброго времени суток! Объясните пожалуйста разницу между загрузкой и инициализацией класса.

Инициализация статического объекта типа Х внутри класса Х
Приветствую! Прошу прощения, если вопрос не нов и давно разъяснен, возможно, искал не по тем...

Инициализация полей в форме Struts
Привет! Возник следующий вопрос: нужно один раз проинициализировать поля в форме (ValidatorForm,...

Инициализация полей класса
Приветствую всех. Не в одной книге по С++ сказано, что поля класса желательно инициализировать в...

Инициализация полей класса
Привет! Не могу инициализировать в конструкторе поля класса. Интерфейс класса в отдельном файле....

Обращение и инициализация полей класса
привет! помогите пожалуйста разобраться, как это работает. нужно понять что просходит под...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.