Урок 9

Ключевое слово final


1. final переменные

Поле может быть объявлено как final. Это позволяет предотвратить изменение содержимого переменной, сделав ее, по существу, константой.

final переменная класса, объявленная как не static, должна инициализироваться при объявлении или в теле конструктора или блоке инициализации, иначе произойдет ошибка компиляции.

Кроме полей, объявленными как final могут быть параметры метода и локальные переменные. final переменные, объявленные как static, должны быть проинициализированы при объявлении или в блоке инициализации, также объявленном как static. В противном случае, опять получится ошибка компиляции. 

Пример 1. Использование final переменных

public class FinalVariables {
    public static final int FILE_NEW = 1;
    private final String someString = "something";

    public static void print(final double d) {
        //  FILE_NEW = 2;
        final String str;
        str = "someString";
        //  str ="";
        //  d=4;
        System.out.println("FILE_NEW = " + FILE_NEW);
        System.out.println("str = " + str);
        System.out.println("d = " + d);
    }

    public static void main(String[] args) {
        print(3);
    }
}

Константы используются для борьбы c магическими числами, т.е. непонятно что означающими числами или строками. Например следующий код содержит магическое число 9.81:

double potentialEnergy(double mass, double height) {
    return mass * height * 9.81;
}

После рефакторинга:

public static final double ACCELERATION = 9.81;
public double potentialEnergy(double mass, double height) {
    return mass * height * ACCELERATION;
}

2. final методы

Чтобы запретить переопределение метода, в начале его объявления следует указать ключевое слово final.

Не имеет смысла объявлять метод private final так как private метод не виден в наследниках, соответственно не может быть переопределен.

Конструктор не может быть final.

Пример 2. Завершенный метод

public class O {
    final void method() {
        System.out.println("Это завершенный метод");
    }
}
public class P extends O {
    //Этот метод не может быть переопределен
    /* void method() {
        System.out.println("Надопустимо");
    }*/
}

3. Предотвращения наследования с помощью ключевого слова final

Для предотвращения наследование класса в начале объявления класса следует указать ключевое слово final.

Объявление класса завершенным неявно делает завершенными и все его методы. Одновременное объявление класса как abstract и final недопустимо.

Пример 3. Попытка расширить класс

final class А{
	//…
}
class B extends A {// ОШИБКА! Класс А не может иметь подклассы
	//…
}


0 comments
Leave your comment: