Từ khóa final trong Java được sử dụng để hạn chế người dùng. Từ khóa final có thể được sử dụng trong nhiều ngữ cảnh:
- Biến final: bạn không thể thay đổi giá trị của biến final (nó sẽ là hằng số).
- Phương thức final: bạn không thể ghi đè phương thức final.
- Lớp final: bạn không thể kế thừa lớp final.
- 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. Chúng ta sẽ tìm hiểu chi tiết về những điều này.
Nội dung chính
1.Biến final trong Java
Nếu bạn tạo bất cứ biến nào là final, bạn không thể thay đổi giá trị của biến final (nó sẽ là hằng số).
Ví dụ của biến final trong Java:
Giả sử có một biến final là MAX_SPEED. Bạn 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.
public class FinalExam1 { final int MAX_SPEED = 90; // biến final void run() { MAX_SPEED = 400; } public static void main(String args[]) { FinalExam1 obj = new FinalExam1(); obj.run(); } }
Kết quả:
Compile Time Error Exception in thread "main" java.lang.Error: Unresolved compilation problem: The final field FinalExam1.MAX_SPEED cannot be assigned
2. Phương thức final trong Java
Trong java, bạn không thể ghi đè phương thức final.
Ví dụ về phương thức final trong java
class Bike { final void run() { System.out.println("running"); } } public class SH extends Bike { void run() { System.out.println("Chay an toan voi 150km/h"); } public static void main(String args[]) { SH sh = new SH(); sh.run(); } }
Kết quả:
Exception in thread "main" java.lang.VerifyError: class vn.viettuts.keywords.SH overrides final method run.()V
3. Lớp final trong Java
Trong java, bạn không thể kế thừa lớp final.
Ví dụ về lớp final trong java:
final class Bike { } public class SH1 extends Bike { void run() { System.out.println("Chay an toan voi 150km/h"); } public static void main(String args[]) { SH1 sh = new SH1(); sh.run(); } }
Kết quả:
Compile Time Error
Câu hỏi: Phương thức final có được kế thừa không?
Trả lời: Có, phương thức final được kế thừa nhưng bạn không thể ghi đè nó. Ví dụ:
class Bike { final void run() { System.out.println("running..."); } } class Honda2 extends Bike { public static void main(String args[]) { new Honda2().run(); } }
Kết quả:
running...
Câu hỏi: Biến final trống hoặc không được khởi tạo là gì?
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.
Nếu bạn muốn tạo một biến mà được khởi tạo tại thời điểm tạo đối tượng và một khi nó đã được khởi tạo thì không thể bị thay đổi, thì biến final trống là hữu ích trong trường hợp này. Ví dụ như số thẻ PAN CARD của một nhân viên.
Nó chỉ có thể được khởi tạo trong Constructor.
Ví dụ:
public class Student { int id; String name; final String PAN_CARD_NUMBER; // Biến final trống public Student() { PAN_CARD_NUMBER = "7777"; } }
4. Biến static final trống trong Java
Một biến static final mà không được khởi tạo tại thời điểm khai báo thì đó là biến static final trống. Nó chỉ có thể được khởi tạo trong khối static.
Ví dụ:
public class A { static final int data; // Biến static final trống static { data = 50; } public static void main(String args[]) { System.out.println(A.data); } }
Câu hỏi: Tham số final là gì?
Nếu bạn khai báo bất cứ tham số nào là final, thì bạn không thể thay đổi giá trị của nó.
Ví dụ:
class B { int cube(final int n) { n = n + 2; // không thể thay đổi được khi n là final return n; } public static void main(String args[]) { B b = new B(); b.cube(5); } }
Kết quả:
Compile Time Error
Câu hỏi: Chúng ta có thể khai báo một constructor final không?
Không, bạn không thể khai báo một construtor với từ khóa final trong java.