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ífinalfinallyfinalize
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ạiTừ 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à:

Exception in thread "main" java.lang.Error: Unresolved compilation problem: The final local variable age cannot be assigned. It must be blank and not using a compound assignment at Example.main(Example.java:4)

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à:

Ngoại lệ đã xảy ra: java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3
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à:

Kết thúc chương trình main
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.

Sự khác nhau giữa final, finally và finalize trong Java - minh họa
Sự khác nhau giữa final, finally và finalize trong java.

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.

Câu Nói Truyền Cảm Hứng

“Bắt đầu ở đâu không quan trọng, quan trọng là bạn sẵn sàng bắt đầu.” – W. Clement Stone

Không Gian Tích Cực

“Chúc bạn luôn giữ vững niềm tin và sức mạnh để vượt qua mọi thử thách trong cuộc sống.”