Ведь конструктор и занимается инициализированием нестатических полей класса. Но везде пишут, что нестатические поля и блоки инициализируются раньше конструктора. Как так?
Не совсем так.
У нас есть конструктор по умолчанию:
Joestar(){
//Код
}
Мы идём в метод main и запускаем его:
Joestar jotaro = new Joestar();
Всё. Конструктор запущен. Теперь он начинает работу:
Поехали.
1) Программа проверяет есть ли в первой строчке тела конструктора (т.е. между "{ }") конструкции this() и super(). Кажется, что в нашем случае ни первой, ни второй нет, однако на самом деле JVM всё-равно вызывает неявный конструктор суперкласса super() (если у класса, объект которого мы создаём, нет класса-родителя, то вызываться будет конструктор класса Object, который возвращает пустое значение(т.е. ничего не делает. Вообще)). (Если этот пункт не очень понятен - можно его пока пропустить).
2) Далее, происходит инициализация нестатических полей объекта (не класса!) и нестатического блока инициализации (если он есть);
3) Выполняется код в теле конструктора.
4) Объект создан. Теперь ему присваивается переменная Jotaro.
Запомните, нестатических полей класса не существует в природе. Все нестатические поля - это поля конкретного объекта.
class Joestar
float height;
String name;
int age;
String stand;
static int joestarFamilyMembersCount = 1;
Полей height, name, age и stand не существует, пока не создан хотя бы один объект класса Joestar, а когда он будет создан, эти переменные будут жить только внутри него и сослаться на них можно будет тоже только через него.
Неплохо обобщить знания о процессе создания объекта. Для примера возьмем класс с именем Dog:
□ Хотя ключевое слово static и не используется явно, конструктор в действительности является статическим методом. При создании первого объекта типа Dog или при первом вызове статического метода/обращения к статическому полю класса Dog интерпретатор Java должен найти класс Dog.class. Поиск осуществляется в стандартных каталогах, перечисленных в переменной окружения CLASSPATH.
□ После загрузки файла Dog.class производится инициализация статических элементов. Таким образам, инициализация статических членов проводится только один раз, при первой загрузке объекта Class.
□ При создании нового объекта конструкцией new Dog() для начала выделяется блок памяти, достаточный для хранения объекта Dog в куче.
□ Выделенная память заполняется нулями, при этом все примитивные поля объекта Dog автоматически инициализируются значениями по умолчанию (ноль для чисел, его эквиваленты для типов boolean и char, null для ссылок).
□ Выполняются все действия по инициализации, происходящие в точке определения полей класса.
□ Выполняются конструкторы.
Виртуальный выделенный сервер (VDS) становится отличным выбором
В коде метода start у класса Thread, текущий поток добавляет себя в группуНа каком этапе объект Thread'а будет удален из группы и собран GC
Я новичок в nodejs, хочу запустить простой чат с помощью сервиса heroku и библиотеки socket