1. Từ khóa Final trong Java

Từ khóa final trong Java dùng để hạn chế người dùng. Ta dịch final ra tiếng việt có nghĩa là cuối cùng. Còn trong lập trình hay trong Java, final có nhiều nghĩa khác nhau. Nghĩa của nó tùy thuộc vào ngữ cảnh cụ thể. Nhưng nói chung ta có thể hiểu nôm na là cái này sẽ không thể thay đổi được.

Một số ngữ cảnh như:

  • Biến final : khi một biến được khai báo với từ khoá final, nó chỉ chứa một giá trị duy nhất trong toàn bộ chương trình (hay dễ hiểu hơn gọi là biến hằng).
  • Phương thức final : khi một phương thức được khai báo với từ khoá final, các class con kế thừa sẽ không thể ghi đè (override) phương thức này.
  • Lớp final : khi từ khoá final sử dụng cho một lớp, lớp này sẽ không thể được kế thừa.
  • Biến static final trống: Một biến final mà không được khởi tạo tại thời điểm khai báo được gọi là biến final trống.

Từ khóa final có thể được áp dụng với các biến, một biến final mà không có giá trị nào được gọi là biến final trống hoặc biến final không được khởi tạo. Nó chỉ có thể được khởi tạo trong Constructor. Biến final trống cũng có thể là static mà sẽ chỉ được khởi tạo trong khối static.

2. Biến final trong Java

Nếu ta tạo bất cứ biến nào là final ta không thể thay đổi giá trị của biến final(ta có thể coi nó là hằng số). Giả sử có một biến final là PI. Ta cố ý thay đổi giá trị của biến này nhưng nó không bị thay đổi, bởi vì biến final một khi được gán giá trị thì không bao giờ thay đổi được.

Ví dụ:

public class Main {
    final int PI = 3.14159265; // biến final là hằng số và không thể thay đổi

    void run() {
        PI = 22;
    }

    public static void main(String args[]) {
        Main obj = new Main();
        obj.run();
    }
}

Kết quả : một lỗi sẽ hiển thị ra đại loại thế này

Compile Time Error Exception in thread "main" java.lang.Error: Unresolved compilation problem: The final field Thaycacac.PI cannot be assigned

Chú ý

Khi khai báo một thuộc tính là final thì ta phải cung cấp giá trị ban đầu cho nó

Nếu một thuộc tính vừa là final vừa là static thì nó chỉ có một vùng nhớ chung duy nhất cho cả lớp

Nên sử dụng chữ in hoa để khai báo biến final trong Java

2.1. Biến final có giá trị đầu

public class Demo{

    final int MAX_VALUE=99;
    void myMethod(){
        MAX_VALUE=101;
    }
}
public class Main {
    public static void main(String args[]){
        Demo obj=new  Demo();
        obj.myMethod();
    }
}

Kết quả : một lỗi hiển thị đại loại như thế này

Error:(5, 9) java: cannot assign a value to final variable MAX_VALUE

Các hằng số trong Java sẽ được đặt tên bằng các chữ cái in hoa. Giữa các chữ cách nhau bằng ký tự (_).

2.2. Biến final không có giá trị đầu

Một biến final khi được khai báo mà không gán giá trị được gọi là biến final không có giá trị đầu. Những biến final không có giá trị đầu này phải được khởi tạo giá trị trong Constructor.

Ví dụ:

class Demo{

    final int MAX_VALUE;
    Demo() {
        MAX_VALUE = 99;
    }
}
class Main extends Demo {
    public static void main(String args[]){
        Demo obj = new Demo();
        System.out.println(obj.MAX_VALUE);
    }
}

Kết quả

99

2.3. Khởi tạo biến final thông qua static block

Ngoài việc khởi tạo biến trong Constructor, chúng ta còn có thể khởi tạo chúng trong static block.

Ví dụ:

class Demo{  
   static final int MAX_VALUE;
   static{ 
      MAX_VALUE = 12;
   }  
}
public class Main extends Demo {
    public static void main(String args[]){
        Demo obj=new  Demo();
        System.out.println(obj.MAX_VALUE);
    }
}

Kết quả

12

3. Phương thức final trong Java

Ta cũng có thể tạo ra một phương thức final. Một phương thức bình thường có thể bị ghi đè ở lớp con, đôi khi ta không muốn lớp con bị ghi đè ở lớp con vì lý do gì đó, mục đích chủ yếu của các phương thức final là tránh ghi đè. Tuy nhiên các phương thức private sẽ tự động là final vì chúng không thể thấy được trong lớp con nên chúng không thể bị ghi đè. Cho dù ta có cho một phương thức privatefinal thì cũng chả thấy thay đổi nào.

Ví dụ:

class XeDap{  
  final void chay(){
    System.out.println("Xe đang chạy");
  }  
}  
     
class Main extends XeDap{  
  void run(){
    System.out.println("Xe chạy với tốc độ 10km trên giờ");
  }  
     
  public static void main(String args[]){  
    Main main = new Main();  
    main.chay();  
   }  
}

Kết quả

Xe đang chạy

4. Lớp final trong Java

Nếu ta tạo thông báo một class là final nó sẽ không thể được kế thừa trong Java. Ta sẽ nhận được thông báo lỗi khi cố tình kế thừa từ lớp final.

Ví dụ:

final class Bike {
}

public class Main extends Bike {
    void run() {
        System.out.println("Chay an toan voi 150km/h");
    }

    public static void main(String args[]) {
        Main main = new Main();
        Main.run();
    }
}

Kết quả: hiển thị ra một lỗi

5. Chú ý tổng hợp về final trong Java

Một constructor không thể khai báo với từ khoá final

Biến final có thể khởi tạo lúc khai báo biến, Constructor và static block.

Tất cả các biến được khai báo bên trong interface được mặc định là final.

Chúng ta không thể thay đổi giá trị của các biến final sau khi nó đã được khởi tạo.

Final method không thể override.

Nếu các tham số đầu vào của method được khai báo với từ khoá final thì nó sẽ không thể thay đổi giá trị trong quá trình thực thi code bên trong method đó.

Biến final được đặt tên bằng chữ cái in hoa, mỗi chữ cách nhau bằng ký tự (_).