Final Keyword in Java
The final keyword in Java is a very important keyword that is used to apply some restrictions to the user. The final keyword can be applied to classes, methods, and variables in Java. In this article, we will see What is the final variable in java, the final method in java, and final class in java. It is the most common and important question asked in the interview. An interviewer can ask what is the use of final keyword in java and final keyword in java with example? What does it mean by making the final variable, final method, and final class in java? Why do we use it?
Final is a reserved word or keyword in Java that can be used with a variable to make a constant, used with a method to restrict the method overriding, and used with a class to restrict the inheritance of class.
1. final variable in java
In java, final variables are just like constants. If you want to make any constant variable, then use the final keyword with the variable. After initialization of the value, we can’t the value of the final variable.
Note: It is not mandatory to initialize a final variable at the time of declaration. You can initialize it by constructor you can read it in detail. If you are not initializing it at the time of declaration, it’s called a blank final variable.
It is good practice to represent final variables in all uppercase, using an underscore to separate words. You can read it in detail here.
dataType final variableName;
int final a = 0; String final s = "Hi"; float final = 0.2f;
2. final method in java
We can declare a final method by use of the final keyword. A final method can’t be overridden in the child class. If we want to enforce the implementation to all the derived classes then we can use the final method. By use of the final method, we can apply the restriction in inheritance. You can read it in detail here.
accessModifier final returnType methodName() < // Body of method >
3. final class in java
We can declare a class as a final class with the final keyword. If a class is a final class, then it can’t be extended(inherited). By use of final with classes is to create an immutable class like the predefined String class. You can read it in detail here.
Can we declare a constructor with the final keyword?
No, we can’t declare a constructor with the final keyword. As you know, the final method can’t be overridden in a driven class. Because the final keywords prevent a method from being modified in a subclass. So it is basically used for sensitive information or security purpose. The objective to make a method final is that the data/content of the final method must not be able to change by anyone.
As you already know about inheritance, You can inherit the members/methods of a base class in the derived class. But you can’t inherit the constructors of the base class. So there is no need to make a constructor as a final.
4 thoughts on “Final Keyword in Java”
Sir, your way of explations Java is very good. You have performed all parts of Java very well. I have read all these Java parts very well and I have learned a lot from it. Log in to Reply
The explanation of all the topics are perfect. This is very helpful to me thanks a lot… 👍 Log in to Reply
Вот так final…
В java есть ключевое слово – final . Оно может применяться к классам, методам, переменным (в том числе аргументам методов). Для класса это означает, что класс не сможет иметь подклассов, т.е. запрещено наследование. Это полезно при создании immutable (неизменяемых) объектов, например, класс String объявлен, как final .
public final class String < >class SubString extends String < //Ошибка компиляции >
Следует также отметить, что к абстрактным классам (с ключевым словом abstract ), нельзя применить модификатор final , т.к. это взаимоисключающие понятия. Для метода final означает, что он не может быть переопределен в подклассах. Это полезно, когда мы хотим, чтобы исходную реализацию нельзя было переопределить.
public class SuperClass < public final void printReport()< System.out.println("Report"); >> class SubClass extends SuperClass < public void printReport()< //Ошибка компиляции System.out.println("MyReport"); >>
Для переменных примитивного типа это означает, что однажды присвоенное значение не может быть изменено. Для ссылочных переменных это означает, что после присвоения объекта, нельзя изменить ссылку на данный объект. Это важно! Ссылку изменить нельзя, но состояние объекта изменять можно. С java 8 появилось понятие — effectively final . Применяется оно только к переменным (в том числе аргументам методов). Суть в том, что не смотря на явное отсутствие ключевого слова final , значение переменной не изменяется после инициализации. Другими словами, к такой переменной можно подставить слово final без ошибки компиляции. effectively final переменные могут быть использованы внутри локальных классов ( Local Inner Classes ), анонимных классов ( Anonymous Inner Classes ), стримах (Stream API).
public void someMethod() < // В примере ниже и a и b - effectively final, тк значения устанавливаютcя однажды: int a = 1; int b; if (a == 2) b = 3; else b = 4; // с НЕ является effectively final, т.к. значение изменяется int c = 10; c++; Stream.of(1, 2).forEach(s->System.out.println(s + a)); //Ок Stream.of(1, 2).forEach(s-> System.out.println(s + c)); //Ошибка компиляции >
- Что можно сказать про массив, когда он объявлен final ?
- Известно, что класс String — immutable , класс объявлен final , значение строки хранится в массиве char , который отмечен ключевым словом final .
public final class String implements java.io.Serializable, Comparable, CharSequence < /** The value is used for character storage. */ private final char value[];
- Т.к. массив – это объект, то final означает, что после присвоения ссылки на объект, уже нельзя ее изменить, но можно изменять состояние объекта.
final int[] array = ; array[0] = 9; //ок, т.к. изменяем содержимое массива – array = new int[5]; //ошибка компиляции
import java.lang.reflect.Field; class B < public static void main(String[] args) throws Exception < String value = "Old value"; System.out.println(value); //Получаем поле value в классе String Field field = value.getClass().getDeclaredField("value"); //Разрешаем изменять его field.setAccessible(true); //Устанавливаем новое значение field.set(value, "JavaRush".toCharArray()); System.out.println(value); /* Вывод: * Old value * JavaRush */ >>
Обратите внимание, что если бы мы попытались изменить подобным образом финальную переменную примитивного типа, то ничего бы не вышло. Предлагаю вам самостоятельно в этом убедить: создать Java класс, например, с final int полем и попробовать изменить его значение через Reflection API. Всем удачи!