Đầu tiên, một câu đố: Mã sau đây in gì?
public class RecursiveStatic {
public static void main(String[] args) {
System.out.println(scale(5));
}
private static final long X = scale(10);
private static long scale(long value) {
return X * value;
}
}
Câu trả lời:
0
Kẻ phá hoại dưới đây.
Nếu bạn in X
về quy mô (dài) và xác định lại X = scale(10) + 3
, các bản in sẽ X = 0
sau đó X = 3
. Điều này có nghĩa X
là tạm thời được đặt thành 0
và sau đó được đặt thành 3
. Đây là một vi phạm final
!
Công cụ sửa đổi tĩnh, kết hợp với công cụ sửa đổi cuối cùng, cũng được sử dụng để xác định các hằng số. Công cụ sửa đổi cuối cùng chỉ ra rằng giá trị của trường này không thể thay đổi .
Nguồn: https://docs.oracle.com/javase/tutorial/java/javaOO/ classvars.html [nhấn mạnh thêm]
Câu hỏi của tôi: Đây có phải là một lỗi? Là final
không xác định?
Đây là mã mà tôi quan tâm.
X
Được gán hai giá trị khác nhau: 0
và 3
. Tôi tin rằng điều này là vi phạm final
.
public class RecursiveStatic {
public static void main(String[] args) {
System.out.println(scale(5));
}
private static final long X = scale(10) + 3;
private static long scale(long value) {
System.out.println("X = " + X);
return X * value;
}
}
Câu hỏi này đã được gắn cờ là một bản sao có thể có của thứ tự khởi tạo trường tĩnh cuối cùng của Java . Tôi tin rằng câu hỏi này không phải là một bản sao vì câu hỏi khác giải quyết thứ tự khởi tạo trong khi câu hỏi của tôi giải quyết việc khởi tạo theo chu kỳ kết hợp với final
thẻ. Từ câu hỏi khác, tôi không thể hiểu tại sao mã trong câu hỏi của tôi không gây ra lỗi.
Điều này đặc biệt rõ ràng bằng cách nhìn vào đầu ra mà ernesto nhận được: khi a
được gắn thẻ final
, anh ta nhận được đầu ra sau:
a=5
a=5
mà không liên quan đến phần chính của câu hỏi của tôi: Làm thế nào một final
biến thay đổi biến của nó?
A blank final instance variable must be definitely assigned (§16.9) at the end of every constructor (§8.8) of the class in which it is declared; otherwise a compile-time error occurs.
X
thành viên này giống như tham chiếu đến một thành viên lớp con trước khi trình xây dựng siêu hạng kết thúc, đó là vấn đề của bạn chứ không phải định nghĩafinal
.