Я попытался найти этот вопрос через поисковую систему, но мог найти тему, объясняющую разницу между инициализацией класса и созданием объекта.
Может кто-нибудь объяснить, как они отличаются?
Я попытался найти этот вопрос через поисковую систему, но мог найти тему, объясняющую разницу между инициализацией класса и созданием объекта.
Может кто-нибудь объяснить, как они отличаются?
Есть три части терминологии, связанной с этой темой: объявление, инициализация и создание экземпляров.
Работаем сзади-вперед.
Конкретизация
Это когда память выделяется для объекта. Это то, что делает new
ключевое слово. Ссылка на созданный объект возвращается из new
ключевого слова.
инициализация
Это когда значения помещаются в память, которая была выделена. Это то, что делает конструктор класса при использовании new
ключевого слова.
Переменная также должна быть инициализирована путем передачи ей ссылки на некоторый объект в памяти.
декларация
Это когда вы заявляете программе, что будет существовать объект определенного типа, и каким будет имя этого объекта.
Пример инициализации и создания экземпляра в одной строке
SomeClass s; // Declaration
s = new SomeClass(); // Instantiates and initializes the memory and initializes the variable 's'
Пример инициализации переменной в другой строке памяти
void someFunction(SomeClass other) {
SomeClass s; // Declaration
s = other; // Initializes the variable 's' but memory for variable other was set somewhere else
}
Я также настоятельно рекомендую прочитать эту статью о природе того, как Java обрабатывает передачу переменных.
Когда Java-класс загружается в JVM, представление класса должно быть инициализировано несколькими способами.
Существует определенный набор терминов, используемых для обозначения инициализации класса, хотя я не помню специфику. Некоторые вещи могут возникать только после того, как класс был инициализирован в определенную точку и т.д.
Активация объекта возможна только после того, как класс был загружен и инициализирован (хотя все методы не обязательно должны быть проверены). Размер объекта получен из класса, и много кучи расположено и обнулено. Заголовок объекта заполняется указателем на класс и другие поля, используемые для управления классом. Затем вызывается соответствующий метод конструктора для класса (и он будет вызывать любой супер-конструктор).
Инициализация класса выполняется с использованием статического блока инициализации. (static {}). Это не метод, это инициализатор. Он выполняется при первом обращении к классу.
Активация объекта выполняется, например, с помощью нового ключевого слова, вызывая его конструктор. В это время статический блок инициализации не будет выполнен.
Инициализация означает, что когда конструктор выполняется. и экземпляр означает, что когда объект помещен на таране!
class Test{
Test(){
System.out.println("The test class is initialized.");
}
{
System.out.println("The test class is instantiated.");
}
public static void main(String args[]){
Test test = new Test();
}
}
The test class is instantiated.
The test class is initialized.