Рубрики
Без рубрики

Примеры ключевых слов Java final

Ключевое слово final в Java можно использовать с переменными, методами и классами. Конечные переменные: Когда мы помечаем переменную как окончательную, мы не можем переназначить ее

Автор оригинала: Pankaj Kumar.

Ключевое слово final в Java можно использовать с переменными, методами и классами.

  1. Конечные переменные : Когда мы помечаем переменную как конечную, мы не можем переназначить ее значение.
  2. Окончательный класс : Когда класс является окончательным, мы не можем его продлить.
  3. Окончательный метод : Мы не можем переопределить окончательный метод.

Давайте рассмотрим последнее ключевое слово более подробно.

1. Конечные Переменные

Java позволяет нам двумя способами создать переменную и присвоить ей некоторое значение.

  1. Мы можем объявить переменную и присвоить ей значение позже.
  2. Мы можем объявить переменную и присвоить значение в одном и том же операторе, используя оператор присваивания.

Давайте рассмотрим использование конечных переменных для обоих сценариев.

package com.journaldev.examples;

public class Config {

	final static String NAME = "CONFIG";

	final long initTime;

	Config() {
		this.initTime = System.currentTimeMillis();
	}

	public static void main(String[] args) {
		Config cfg1 = new Config();
		System.out.println(cfg1.initTime);

		Config cfg2 = new Config();
		System.out.println(cfg2.initTime);

		// The final field Config.NAME cannot be assigned
//		Config.NAME = "config";

		// The final field Config.initTime cannot be assigned
//		cfg1.initTime = 1L;
	}
}

1.1) Конечные переменные Java являются постоянными?

Поскольку мы не можем переназначить новое значение конечной переменной, они выглядят как константы. Но это зависит от типа конечной переменной.

Если тип данных конечной переменной неизменяем, например примитивы и строка, то конечная переменная останется постоянной.

Если конечный тип данных переменной является изменяемым, мы можем вызвать методы для изменения состояния объекта. В этом случае конечная переменная не является постоянной, так как ее можно изменить.

Давайте разберемся в этом на простом примере.

package com.journaldev.examples;

public class FinalExamples {

	// data types are immutable
	final static int COUNT = 10;
	final static String NAME = "FinalExamples";
	
	// data types are mutable
	final static StringBuilder SB = new StringBuilder();
	
	public static void main(String[] args) {
		SB.append("Hello");
		System.out.println(SB.toString());
		
		SB.append("Java");
		System.out.println(SB.toString());

	}
	
}

1.2) Локальные Конечные переменные

Когда конечная переменная создается внутри метода, она называется локальной конечной переменной.

void foo(int[] ints) {
	final int x = 10;
	final boolean flag;
	flag = true;

	for (final int i : ints) {
		System.out.println(i);
	}
}

Мы можем использовать ключевое слово final в расширенном цикле for, потому что по завершении итерации цикла for каждый раз создается новая переменная. То же самое не относится к обычному циклу for, поэтому приведенный ниже код приведет к ошибке во время компиляции.

// The final local variable j cannot be assigned. 
// It must be blank and not using a compound assignment
for(final int j = 0; j< ints.length; j++) {
	System.out.println(j);
}

2. Заключительный урок

Когда класс объявлен как окончательный, мы не можем его расширить. Это называется заключительный урок. Идеальным примером конечного класса в JDK является класс String.

Если вам нужно создать неизменяемый класс, вы должны пометить его как конечный класс.

final class SecureAccess{
	
}

//compile time error
//class MoreSecureAccess extends SecureAccess {}

Заключительный класс Java

3. Окончательные Методы

Когда метод помечен как окончательный, он называется окончательным методом. Окончательный метод не может быть переопределен в подклассе. Например, методы класса объектов wait() и notify() являются окончательными, и мы не можем переопределить их в наших классах реализации.

Перегрузка допускается для конечных методов. Давайте рассмотрим пример конечных методов в Java.

package com.journaldev.examples;

public class Base {
	
	final void foo(int i) {}
	
	//overloading is allowed
	void foo(int i, String s){}
}

class Child extends Base{
	
	@Override
	void foo(int i, String s) {}
	
	@Override
	// void foo(int i) {}
}

Окончательный метод Java

4. Когда использовать ключевое слово final в Java?

  • Мы можем использовать ключевое слово final для определения некоторых констант уровня класса.
  • Создавайте конечные переменные для объектов, если вы не хотите, чтобы они изменялись, например, свойства конкретных объектов, которые мы можем использовать для целей ведения журнала.
  • Если вы не хотите, чтобы класс был расширен, отметьте его как окончательный.
  • Если вы создаете неизменяемый класс, вы должны сделать его конечным классом.
  • Если вы хотите, чтобы реализация метода оставалась одинаковой для всех подклассов, отметьте их как окончательный метод.

5. Ссылки