1. Окончательная переменная
Окончательная переменная - это постоянная, которая не может быть изменена после того, как она инициализирована.
класс Test1 {final Double Pi = 3.14; // Имя константы лучше всего заглаживать public Test1 () {pi = 3.14; } void test () {System.out.println ("pi is:" + pi); } public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Выход:
Пи: 3.14
(1) пустая окончательная переменная
Окончательная переменная, которая не инициализируется во время объявления, называется пустой конечной переменной. За пустая конечная переменная должна быть инициализирована в конструкторе, в противном случае будет выбрана ошибка компиляции.
Класс Test1 {final Double Pi; Test1 () {pi = 3.14; // инициализировать в конструкторе} void test () {System.out.println ("pi is:" + pi); } public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Выход:
Пи: 3.14
(2) Неинициализированная статическая конечная переменная
Статическая конечная переменная, которая не инициализируется на этапе объявления, может быть инициализирована только в статических блоках кода.
Класс Test1 {статический окончательный двойной пи; static {pi = 3.14; } void test () {System.out.println ("pi is:" + pi); } public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Выход:
Пи: 3.14
2. Окончательный метод
Последний метод не может быть перезаписан. То есть подкласс может вызвать метод Fianl родительского класса, но не может его перезаписать.
Класс Тест {статический окончательный двойной PI = 3,14; final void test () {System.out.println ("pi is:" + pi); }} class test1 Extends test {public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Выход:
Пи: 3.14
3. Финальный класс
Окончательные CAL не могут быть унаследованы
Окончательный класс Test1 {статический окончательный двойной PI = 3,14; final void test () {System.out.println ("pi is:" + pi); } public static void main (string [] args) {test1 t = new test1 (); t.test (); }} Выход:
Пи: 3.14
PS: Почему класс java.lang.string разработан как окончательный?
Прежде всего, вы должны четко прояснить ключевое слово.
Финал, кажется, не хочет меняться, но есть две причины не желать менять: дизайн или эффективность. Класс, модифицированный финалом, не может быть унаследован, поэтому класс, модифицированный финалом, не может быть подделан.
Понимая это, давайте посмотрим на проблему:
(1) С точки зрения дизайна,
A. Убедитесь, что они не меняют семантику на подклассах. Класс строки является последним классом, что означает, что никому не разрешается определить подкласс строки. Другими словами, если есть ссылка на строку, она должна относиться к строковому объекту, но он не может быть объектом других классов.
B. Строка не может быть изменена после ее создания, потому что дизайнер Java поделится строкой. Следующий абзац - комментарий в исходном коде:
(2) С точки зрения эффективности:
A. Разработанный как окончательный, JVM не нуждается в том, чтобы спрашивать связанные методы в таблице виртуальных функций, но непосредственно определяет их в соответствующих методах класса строки, повышая эффективность выполнения.
B. Дизайнеры Java считают, что совместное использование приносит большую эффективность.
Короче говоря, необходимо убедиться, что объект, на который ссылаются java.lang.string, должен быть объектом java.lang.string, а не классом, который ссылается на его потомков, чтобы обеспечить ее эффективность и безопасность.