За загрузку файлов классов отвечает ClassLoader. Посмотрим, что произойдет, когда мы напишем наши собственные классы.
Пример 1:
class StaticTest {
static int a;
int b;
int c;
}
Теперь мы можем видеть, что класс "StaticTest" имеет 3 поля. Но на самом деле нет переменной-члена b, c. ОК, дабы увидеть. Здесь b, c - переменная экземпляра. Поскольку переменная экземпляра получает память во время создания объекта. Так что здесь b, c еще не получают никакой памяти. Вот почему не существует б, в. Так что существует только существование.
Для ClassLoader у него есть только одна информация о. ClassLoader пока не распознает b, c, потому что объект еще не создан.
Давайте посмотрим на другой пример:
Пример 2:
class StaticTest {
public void display() {
System.out.println("Static Test");
}
public static void main(String []cmd) {
display();
}
}
Теперь, если мы попытаемся скомпилировать этот код, компилятор выдаст ошибку CE.
CE: на нестатический метод display () нельзя ссылаться из статического контекста.
Теперь для ClassLoader это выглядит так:
class StaticTest {
public static void main(String []cmd) {
display();
}
}
В примере 2 ошибка CE связана с тем, что мы вызываем нестатический метод из статического контекста. Поэтому ClassLoader не может распознать метод display () во время компиляции. Так что произошла ошибка во время компиляции.