class Solution0 {
void test() throws Exception {
throw new Exception();
}
}
class Solution extends Solution0 {
void test() {
}
public static void main(String[] args) {
Solution0 object = new Solution();
object.test(); // ошибка компиляции (заставляет обработать исключение) – хотя в методе, который был бы вызван вообще нет исключений.
Solution object2 = (Solution) object;
object2.test(); //а здесь уже нет ошибки компиляции (хотя тот же самый метод будет вызван)
}
}
–происходит обращение к static-членам этого класса или его подкласса
–создаётся на основе этого класса объект
(... в первый раз начиная с запуска программы).
(... не где-то в недостижимом коде, а по факту).
(Пока что я не встревал доказательств что определение не верное, поэтому буду исходить из него).
Поэтому:
1. LocalDateTime загрузился потому что на его основе создался объект.
CountDownLatch не загрузился, потому что не должен был по определению.
BigDecimal загрузился потому что произошло обращение к его членам, да ещё и объект создался.
LocalDateTime не загрузился, потому что не должен был по определению.
(То есть, ваши примеры ни чего нового мне не говорят, всё по определению).
2. Вопрос был в том, входит ли инициализация instance-членов в инициализацию класса, если объект вообще не создаётся? Я проверил с помощью "-verbose:class", не входит: если без объекта – то, что после = в instance-полях не выполняется.
3. Но остались открытыми вопросы про методы. Просьба ответить:
3.1. Инициализировал класс (без создания объекта на его основе). После этого, вызываем статический метод этого класса. Откуда именно в этот момент берётся для выполнения тело метода: из .class файла на жёстком диске, или из оперативной памяти?
3.2 Инициализировал класс (без создания объекта на его основе). После этого, создаём объект на основе этого класса. Откуда именно в этот момент берётся информация для инициализации instance-полей: из .class файла на жёстком диске, или из оперативной памяти?