В традиционных языках программы загружаются целиком в процессе запуска.
В Java код загружается из файлов *.class постепенно. Каждый файл загружается, когда он нужен - в точке первого использования:
- при создания объекта класса;
- при обращение к статическим полям или методам.
При загрузке инициализируются статические объекты и выполняются блоки статической инициализации (только один раз).
Сначала выполняется метод main (). Если у класса есть базовый (extends), он загружается. Затем производится static – инициализация корневого базового класса, затем производных. Далее создается объект класса: все поля обнуляются, затем – вызывается конструктор базового класса. После конструктора базового класса инициализируются переменные (поля). Потом конструктор выполняется дальше.
class Insect {
private int i = 9;
protected int j;
Inseсt (){
System.out.println (“i =”, + i + “, j = ” + j);
j=39;
}
private static int x1 = printInit (“static Insect.x1 инициализировано”);
static int printInit (String s) {
System.out.println (s);
return 47;}
}
public class Beetle extends Insect {
private int k = printInit (“ Beetle.k инизиализировано ”);
public Beetle () {
System.out.println (“k= ” +k);
System.out.println (“j= ” +j); }
private static x2 = printInit (“ static Beetle.x2 инизиализировано”);
public static void main (String [] args) {
System.out.println (“Конструктор Beetle”);
Beetle b = new Beetle (); }
}
Напечатается: static Insect.x1 инициализировано //статическое поле базового класса
static Beetle.x2 инициализировано //стат.поле класса
//это была загрузка классов
Конструктор Beetle
i=9, j=0 // (память обнулилась,память проинициализировалась,выполнился конструктор базового класса)
Beetle.k инициализировано //память проинициализировалась
k=47 //конструктор
j=39
Тема 8