Mục lục
Trong bài viết này, chúng ta sẽ cùng tìm hiểu về từ khoá final trong java. Final có thể sử dụng với biến, method và class.
Biến final trong java
Một biến đi với từ khoá final được hiểu là một hằng số trong java. Đồng nghĩa với việc 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.
Biến final có giá trị đầu
// File Demo.java public class Demo{ final int MAX_VALUE=99; void myMethod(){ MAX_VALUE=101; } }
// File Main.java public class Main { public static void main(String args[]){ Demo obj=new Demo(); obj.myMethod(); } }
Output:
Error:(5, 9) java: cannot assign a value to final variable MAX_VALUE
Note: 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ự (_).
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.
// File Demo.java public class Demo{ final int MAX_VALUE; Demo() { MAX_VALUE = 99; } }
// File Main.java public class Main { public static void main(String args[]){ Demo obj=new Demo(); System.out.println(obj.MAX_VALUE); } }
Output: 99
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.
// File Demp.java public class Demo{ static final int MAX_VALUE; static{ MAX_VALUE = 12; } }
// File Main.java public class Main { public static void main(String args[]){ Demo obj=new Demo(); System.out.println(obj.MAX_VALUE); } }
Output: 12
Final method trong java
Final method sẽ không thể override. Nghĩa là các class con có thể sử dụng các method final của class cha thế nhưng chúng không thể override lại method đấy.
// File A.java public class A { final void display() { System.out.println("method class A"); } }
// File B.java public A class B extends A{ public void display() { System.out.println("Method class B"); } }
Với code của class B như trên chúng ta sẽ gặp lỗi compile, method display() không thể override.
Thế nhưng bỏ qua class B, chúng ta có Main.java như sau
public class Main { public static void main(String args[]){ A a = new A(); a.display(); } }
Output: method class A
Final class trong java
Chúng ta không thể extends một final class trong java, xem ví dụ dưới đây.
// File A.java public final class A { final void display() { System.out.println("method class A"); } } // File B.java public class B extends A { }
Với cách viết như trên chúng ta sẽ gặp lỗi compile rằng không được thừa kế từ class A.
Note
- 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ự _.