Từ Khóa final, finally Và finalize (Final, Finally And Finalize Keywords)
Trong lập trình Java, ba từ khóa final, finally và finalize thường bị nhầm lẫn cho nhiều người mới bắt đầu do sự tương đồng về tên gọi. Tuy nhiên, mỗi từ khóa lại mục đích và cách sử dụng khác nhau. Dưới đây là bảng so sánh chi tiết giữa chúng.
Tiêu chí | final | finally | finalize |
---|---|---|---|
Mục đích | Được sử dụng để khai báo hằng số, lớp không thể kế thừa, hoặc phương thức không thể ghi đè. | Khối mã được thực thi bất kể có xảy ra ngoại lệ hay không trong khối try . | Phương thức đặc biệt được gọi bởi Garbage Collector trước khi đối tượng bị thu hồi. |
Loại | Từ khóa. | Từ khóa. | Phương thức. |
Vị trí sử dụng | - Trước khai báo biến. - Trước khai báo phương thức. - Trước khai báo lớp. | Trong khối lệnh try-catch-finally . | Bên trong một lớp. |
Chức năng chính | - Biến: Không thể thay đổi giá trị. - Phương thức: Không thể ghi đè. - Lớp: Không thể kế thừa. | Đảm bảo khối mã được thực thi cuối cùng. | Dọn dẹp trước khi đối tượng bị thu hồi. |
Ví dụ | final int MAX = 100; public final void method() { ... } public final class MyClass { ... } | try { ... } catch (Exception e) { ... } finally { ... } | @Override protected void finalize() throws Throwable { ... } |
Ví dụ về từ khóa final
Dưới đây là một ví dụ đơn giản về cách sử dụng từ khóa final trong Java:
Ví dụ: Example.java
public class Example {
public static void main(String[] args) {
final int age = 25; // Biến final, giá trị không thể thay đổi
age = 30; // Lỗi biên dịch: Không thể gán giá trị mới cho biến final
System.out.println("Tuổi: " + age);
}
}
Kết quả của chương trình là:
Biến final chỉ có thể được gán giá trị một lần. Trong ví dụ trên, biến age được khai báo là final, và sau khi được gán giá trị là 25, nó không thể bị thay đổi.
Ví dụ về từ khóa finally
Dưới đây là một ví dụ đơn giản về cách sử dụng từ khóa finally trong Java:
Ví dụ: Example.java
public class Example {
public static void main(String[] args) {
try {
int[] numbers = {1, 2, 3};
System.out.println(numbers[3]); // Cố gắng truy cập phần tử không tồn tại (sẽ gây ra ngoại lệ)
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("Ngoại lệ đã xảy ra: " + e);
} finally {
System.out.println("Khối finally luôn được thực thi.");
}
System.out.println("Phần còn lại của chương trình...");
}
}
Kết quả của chương trình là:
Khối finally luôn được thực thi.
Phần còn lại của chương trình...
Khối finally sẽ luôn được thực thi, cho dù ngoại lệ có xảy ra hay không. Điều này hữu ích để thực hiện các hành động dọn dẹp, như đóng tài nguyên hoặc giải phóng bộ nhớ, đảm bảo rằng chúng luôn được thực hiện ngay cả khi có lỗi xảy ra trong khối try.
Ví dụ về từ khóa finalize
Dưới đây là một ví dụ đơn giản về cách sử dụng từ khóa finalize trong Java:
Ví dụ: Example.java
class Example {
// Phương thức finalize được ghi đè
protected void finalize() throws Throwable {
System.out.println("Phương thức finalize được gọi");
}
public static void main(String[] args) {
Example obj = new Example();
obj = null; // Đặt đối tượng về null để cho phép garbage collection
// Yêu cầu Garbage Collector chạy
System.gc();
System.out.println("Kết thúc chương trình main");
}
}
Kết quả của chương trình là:
Phương thức finalize được gọi
Phương thức finalize là một phần của lớp Object, và nó được ghi đè để thực hiện các hành động dọn dẹp trước khi đối tượng bị thu hồi bộ nhớ.
finalize có thể được sử dụng để giải phóng các tài nguyên không thuộc bộ nhớ (ví dụ: đóng tệp hoặc kết nối mạng).
Tuy nhiên, việc sử dụng finalize không được khuyến khích trong các ứng dụng thực tế vì nó không đảm bảo thời điểm hoặc thứ tự mà các đối tượng được thu gom rác. Thay vào đó, các cơ chế như try-with-resources hoặc khối finally thường được sử dụng để giải phóng tài nguyên.

Lưu ý quan trọng: Từ Java 9 trở đi, phương thức finalize đã bị đánh dấu là lỗi thời (deprecated) và sẽ bị loại bỏ trong các phiên bản tương lai của Java. Điều này nhằm khuyến khích các lập trình viên sử dụng các kỹ thuật quản lý tài nguyên khác thay vì dựa vào finalize.