Разница между инициализацией класса и экземпляром объекта?

Я попытался найти этот вопрос через поисковую систему, но мог найти тему, объясняющую разницу между инициализацией класса и созданием объекта.

Может кто-нибудь объяснить, как они отличаются?

Ответ 1

Есть три части терминологии, связанной с этой темой: объявление, инициализация и создание экземпляров.

Работаем сзади-вперед.

Конкретизация

Это когда память выделяется для объекта. Это то, что делает 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 обрабатывает передачу переменных.

Ответ 2

Когда Java-класс загружается в JVM, представление класса должно быть инициализировано несколькими способами.

  • Класс "постоянный пул" расширяется в структуру времени выполнения, а некоторые значения в нем инициализируются.
  • Суперкласс класса находится (через постоянный пул) и атрибуты его извлечены.
  • Для методов класса построена таблица методов. Отдельные методы отмечены как "еще не проверенные".
  • В представлении класса выполняется несколько операций проверки.
  • Статические поля инициализируются.
  • При первой ссылке строковые литералы "интернированы", а интернированный указатель строки помещается в пул констант
  • В первых методах ссылки "проверены".
  • Et al.

Существует определенный набор терминов, используемых для обозначения инициализации класса, хотя я не помню специфику. Некоторые вещи могут возникать только после того, как класс был инициализирован в определенную точку и т.д.

Активация объекта возможна только после того, как класс был загружен и инициализирован (хотя все методы не обязательно должны быть проверены). Размер объекта получен из класса, и много кучи расположено и обнулено. Заголовок объекта заполняется указателем на класс и другие поля, используемые для управления классом. Затем вызывается соответствующий метод конструктора для класса (и он будет вызывать любой супер-конструктор).

Ответ 3

Инициализация класса выполняется с использованием статического блока инициализации. (static {}). Это не метод, это инициализатор. Он выполняется при первом обращении к классу.

Активация объекта выполняется, например, с помощью нового ключевого слова, вызывая его конструктор. В это время статический блок инициализации не будет выполнен.

Ответ 4

Давай тестировать!

Инициализация означает, что когда конструктор выполняется. и экземпляр означает, что когда объект помещен на таране!

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.