Если у вас есть какой-либо опыт интервью, вы могли заметить, что интервьюеры, как правило, задают сложные вопросы, которые обычно берутся из базовых понятий. Один из таких вопросов, который чаще всего задают, заключается в различении между Final, Finally and Finalize на Java.
Что такое Java final?
В Java final — это ключевое слово, которое также можно использовать в качестве модификатора доступа. Другими словами, final ключевое слово используется для ограничения доступа пользователя. Он может использоваться в различных контекстах, таких как:
- Переменная;
- Метод;
- Класс.
С каждым из них последнее ключевое слово имеет разный эффект.
1. Переменная
Всякий раз, когда ключевое слово final в Java используется с переменной, полем или параметром, это означает, что после передачи ссылки или создания экземпляра его значение не может быть изменено во время выполнения программы. Если переменная без какого-либо значения была объявлена как final, тогда она называется пустой / неинициализированной конечной переменной и может быть инициализирована только через конструктор.
Давайте теперь посмотрим на пример.
public class A {
int var1 = 123;
//declaring final variables
final int var2 = 345;
final int var3;
//Trying to initialize a blank final variable
var = 555; //Error
A(){
var1 = 111; //No Error
var2 = 333; //Compilation Error
//Initializing a blank final variable
var3 = 444; //No Error
}
//passing final parameters
void avg(int param1, final int param2){
param1 = 2345; //No Error
param2 = 1223; //Compilation Error
}
//declaring final fields
void show(){
final int fieldVal = 300000;
fieldVal = 400000; //Error
}
}
2. Метод
В Java всякий раз, когда метод объявляется как final, он не может быть переопределен никаким дочерним классом на протяжении всего выполнения программы.
Давайте посмотрим на пример.
//FINAL METHOD
class A {
final void method_abc(){
System.out.println("This is a Final method and cannot be overridden");
}
void method_xyz(){
System.out.println("This is a normal method and can be overridden");
}
}
class B extends A {
void method_abc{
//Compile Time Error
}
void method_xyz(){
System.out.println("This is an overridden method in class B");
}
}
3. Класс
Когда класс объявляется как final, он не может наследоваться ни одним подклассом. Это происходит потому, что, как только класс объявлен как final, все члены-данные и методы, содержащиеся в классе, будут неявно объявлены как final.
Кроме того, как только класс объявлен как final, он больше не может быть объявлен как абстрактный. Другими словами, класс может быть одним из двух, конечным или абстрактным.
Давайте посмотрим на пример.
//FINAL CLASS
final class A {
//class body
}
class B extends A{ //Compilation Error
//class body
}
Блок Finally
В Java, Finally, является необязательным блоком, который используется для обработки исключений. Обычно ему предшествует блок try-catch. Блок finally используется для выполнения важного кода, такого как очистка ресурса или освобождение использования памяти и т. д.
Блок finally будет выполняться независимо от того, обрабатывается ли исключение или нет. Таким образом, упаковка кодов очистки в блок finally считается хорошей практикой. Вы также можете использовать его с блоком try без необходимости использовать блок catch вместе с ним.
class A {
public static void main(String args[]) {
try {
System.out.println("Try Block");
throw new Exception();
} catch (Exception e) {
System.out.println("Catch Block");
} finally {
System.out.println("Finally Block");
}
}
}
Метод Finalize
Finalize — это защищенный нестатический метод, который определен в классе Object и, таким образом, доступен для всех без исключения объектов в Java. Этот метод вызывается сборщиком мусора до полного уничтожения объекта.
Иногда, объекту может потребоваться выполнить какую-то важную задачу, такую как закрытие открытого соединения, освобождение ресурса и т. д., Прежде чем он будет уничтожен. Если эти задачи не будут выполнены, это может снизить эффективность программы.
Таким образом, сборщик мусора вызывает его для объектов, на которые больше нет ссылок и которые помечены для сбора мусора.
Этот метод объявлен как защищенный, чтобы ограничить его использование извне класса. Но вы можете переопределить его внутри класса, чтобы определить его свойства во время сборки мусора.
public class A {
public void finalize() throws Throwable{
System.out.println("Object is destroyed by the Garbage Collector");
}
public static void main(String[] args) {
Edureka test = new Edureka();
test = null;
System.gc();
}
}
В заключение я добавил сравнение всех трех ключевых слов, которое поможет вам быстро определить основные различия.
| Фактор | Final | Finally | Finalize |
|
Определение
|
Final является ключевым словом и используется в качестве модификатора доступа в Java | Finally блок в Java используется для обработки исключений | Метод в Java, используемый для сборки мусора |
|
Использование
|
Final в Java используется с переменными, методами и классами для установки разрешений доступа | Finally блок используется вместе с блоком try and catch | Используется с объектами, которые больше не используются |
|
Функция
|
Конечная переменная в Java-это константа, значение которой не может быть изменено после присвоения. Окончательный метод в Java не может быть переопределен его дочерними классами. Конечный класс в Java не может быть унаследован ни одним дочерним классом. |
Помогает в очистке ресурсов, которые были использованы в блоке try | Помогает в очистке объекта до того, как он будет уничтожен сборщиком мусора |
|
Исполнение
|
Выполняется, когда он вызывается компилятором | Выполняется сразу после выполнения блока try-catch | Выполняется непосредственно перед уничтожением объекта |
