окончательный класс
Последний класс не может быть унаследован. В то же время, как только класс будет изменен с помощью окончательного, это означает, что все методы в конечном классе неявно указаны как окончательные методы.
Окончательный метод
Во время процесса наследования классов подкласс не может быть изменен или перезаписан для окончательного метода в родительском классе.
Все частные методы неявно указаны как конечные методы.
Есть две причины для использования окончательного метода:
окончательная переменная
Окончательное ключевое слово является наиболее часто используемым методом для изменения переменных. Если переменные элемента изменяются, они должны быть инициализированы во время определения или в конструкторе, и после инициализации не может быть назначено присвоение.
Существуют разные значения для основных типов и объектов класса:
Статическое окончательное поле называется постоянным периодом компиляции и обычно капитализируется.
Пример
класс glyph {void draw () {System.out.println ("glyph.draw ()"); } Glyph () {System.out.println ("glyph () перед Draw ()"); рисовать(); System.out.println ("glyph () после Draw ()"); }} класс Roundglyph Extens Glyph {private int redius = 1; Roundglyph (int r) {radius = r; System.out.println ("Roundglyph.roundglyph (), radius =" + radius); } void draw () {System.out.println ("Roundglyph.draw (), radius =" + radius); }} открытый класс rolyconstructors {public static void main (string [] args) {new Roundglyph (5); }} Результат вывода:
Glyph () перед Draw () roundglyph.draw (), radius = 0glyph () после Draw () roundglyph.roundglyph (), radius = 5
Приведенный выше код показывает процесс инициализации класса и скрытые катастрофические проблемы.
Основная функция вызывает конструктор Roundglyph с параметрами 5 для создания объекта Roundglyph, и конструктор Roundglyph его родительского класса Glyph вызывается до выполнения конструктора Roundglyph.
Тем не менее, метод рисования вызывается в конструкторе Glyph родительского класса. Из -за полиморфизма метод притяжения подкласса на самом деле называется. Тем не менее, Redius подкласса не был инициализирован через конструктор в настоящее время, поэтому вывод:
Roundglyph.draw (), radius = 0
Это, очевидно, не тот результат, который мы хотим, поэтому важно отметить:
Вторая причина заключается в том, что окончательный не будет применять полиморфизм, поэтому можно гарантировать, что соответствующий метод текущего объекта называется, а не метод переопределения подкласса, который не был выполнен в работе по инициализации.
Суммируйте метод распределения памяти окончательного:
1. Изменить переменные:
Вообще говоря, есть три места, где можно назначить окончательные переменные: прямое назначение, конструктор или в блоке инициализации.
(1) Инициализация:
Поскольку декларация и инициализация связаны с синтаксисом Java,
То есть: если вы не отображаете переменную инициализации, система автоматически инициализирует ее со значением по умолчанию. (Если int is 0)
Для окончательных переменных, если вы не присваиваете значения при объявлении, система по умолчанию по умолчанию в это пустое поле, которое инициализируется в конструкторе.
Если он статичен, вы можете инициализировать блок.
(2) Память:
Методы обработки констант (конечные переменные) и нефинальные переменные различны.
Когда каждый тип использует константу, он скопирует копию в свой собственный постоянный пул.
Константы также хранятся в области метода, таких как переменные класса (статические), но они хранятся в постоянном пуле.
(Вероятно, переменные класса передаются всеми экземплярами, в то время как постоянные пулы уникальны для каждого экземпляра.)
2. Метод модификации:
Он сохраняется в области метода и может быть заменен непосредственно кодом функции без ожидания, пока выполнение решает, какая функция является конкретной.
3. Категория модификации:
Сохранить в области метода.