Tôi nghĩ về việc viết một câu trả lời cập nhật và chuyên sâu ở đây.
final
từ khóa có thể được sử dụng ở một số nơi.
- các lớp học
Một final class
nghĩa là không có lớp nào khác có thể mở rộng lớp cuối cùng đó. Khi Thời gian chạy Java ( JRE ) biết một tham chiếu đối tượng thuộc loại của lớp cuối cùng (giả sử F), nó biết rằng giá trị của tham chiếu đó chỉ có thể thuộc loại F.
Ví dụ:
F myF;
myF = new F(); //ok
myF = someOther; //someOther cannot be in type of a child class of F.
//because F cannot be extended.
Vì vậy, khi nó thực thi bất kỳ phương thức nào của đối tượng đó, phương thức đó không cần phải giải quyết trong thời gian chạy bằng bảng ảo . tức là đa hình thời gian chạy không thể được áp dụng. Vì vậy, thời gian chạy không bận tâm về điều đó. Có nghĩa là nó tiết kiệm thời gian xử lý, sẽ cải thiện hiệu suất.
- phương pháp
Một final method
lớp bất kỳ có nghĩa là bất kỳ lớp con nào mở rộng lớp đó không thể ghi đè (các) phương thức cuối cùng đó. Vì vậy, hành vi thời gian chạy trong kịch bản này cũng khá giống với hành vi trước đây tôi đã đề cập cho các lớp.
- các trường, biến cục bộ, tham số phương thức
Nếu một trong những chỉ định bất kỳ loại nào ở trên final
, điều đó có nghĩa là giá trị đã được hoàn thành, do đó giá trị không thể thay đổi .
Ví dụ:
Đối với các trường, tham số cục bộ
final FinalClass fc = someFC; //need to assign straight away. otherwise compile error.
final FinalClass fc; //compile error, need assignment (initialization inside a constructor Ok, constructor can be called only once)
final FinalClass fc = new FinalClass(); //ok
fc = someOtherFC; //compile error
fc.someMethod(); //no problem
someOtherFC.someMethod(); //no problem
Đối với tham số phương thức
void someMethod(final String s){
s = someOtherString; //compile error
}
Điều này đơn giản có nghĩa là giá trị của final
giá trị tham chiếu không thể thay đổi. tức là chỉ cho phép một khởi tạo. Trong kịch bản này, trong thời gian chạy, vì JRE biết rằng các giá trị không thể thay đổi, nó tải tất cả các giá trị được hoàn thành này (của các tham chiếu cuối cùng) vào bộ đệm L1 . Bởi vì nó không cần phải tải lại một lần nữa và một lần nữa từ bộ nhớ chính . Nếu không, nó tải vào bộ đệm L2 và thời gian tải từ bộ nhớ chính. Vì vậy, nó cũng là một cải tiến hiệu suất.
Vì vậy, trong tất cả 3 trường hợp trên, khi chúng tôi chưa chỉ định final
từ khóa ở những nơi chúng tôi có thể sử dụng, chúng tôi không cần phải lo lắng, tối ưu hóa trình biên dịch sẽ làm điều đó cho chúng tôi. Ngoài ra còn có rất nhiều thứ khác mà tối ưu hóa trình biên dịch làm cho chúng ta. :)