2013-03-09 38 views
25

Sự khác biệt giữa biến cuối cùng và hằng số thời gian biên dịch là gì?Sự khác nhau giữa các biến cuối cùng và hằng số thời gian biên dịch

Xét đoạn mã sau

final int a = 5; 
final int b; 
b=6; 
int x=0; 
switch(x) 
{ 
    case a: //no error 
    case b: //compiler error 
} 

này có ý nghĩa gì? Khi nào và làm thế nào là các biến cuối cùng được gán một giá trị? Điều gì sẽ xảy ra vào thời gian chạy và những gì xảy ra vào thời gian biên dịch? Tại sao chúng ta nên chuyển đổi hằng số thời gian biên dịch? Cấu trúc nào của java đòi hỏi một hằng số thời gian biên dịch?

+0

Vui lòng tham khảo liên kết đến phần cụ thể của chủ đề này trong JLS –

Trả lời

26

Vấn đề là, tất cả các tuyên bố case: phải là cuối cùng lúc biên dịch. Báo cáo đầu tiên của bạn là cuối cùng. a sẽ cho 100% không có giá trị nào khác hơn 5.

final int a = 5; 

Tuy nhiên, đây là không được bảo đảm cho b. Điều gì sẽ xảy ra nếu có một tuyên bố nếu xung quanh b?

final int b; 
if(something()) 
    b=6; 
else 
    b=5; 
2

Câu lệnh chuyển đổi cần một hằng số. Khi các biến cuối cùng có thể bị trì hoãn khởi tạo và trình biên dịch không thể xác định cho b rằng nó có một giá trị trong nhánh vụ án.

+6

Chắc chắn nhưng tôi vẫn không nhận được câu trả lời cho câu hỏi của mình –

7

Điều này có nghĩa là gì?

Điều đó có nghĩa là 'b' không phải là biểu thức hằng số thời gian biên dịch và JLS yêu cầu nó phải như vậy.

Biến số cuối cùng được phân bổ khi nào và như thế nào?

Chính thức, khi câu lệnh gán hoặc trình khởi tạo được thực thi.

Nhưng trên thực tế, nếu final khai báo hằng số thời gian biên dịch, biểu thức được đánh giá tại thời gian biên dịch và giá trị của nó được nối vào mã.

Điều gì sẽ xảy ra vào thời gian chạy và điều gì xảy ra vào thời gian biên dịch?

Xem ở trên.

Tại sao chúng ta nên chuyển đổi hằng số thời gian biên dịch?

Do JLS yêu cầu.

Trình biên dịch bytecode cần thiết để kiểm tra xem câu lệnh chuyển đổi có được định dạng tốt hay không; nghĩa là các giá trị của hằng số chuyển đổi không xung đột. Nó cũng cho phép trình biên dịch JIT tạo mã được tối ưu hóa cho các giá trị thực tế của hằng số chuyển đổi.

Cấu trúc nào khác của java yêu cầu hằng số biên dịch?

Không có gì tôi có thể nghĩ đến, ngoài đầu của tôi.

3

Từ điểm trình biên dịch của chế độ xem, bạn đang cố sử dụng biến b mà có thể không được khởi tạo. Câu lệnh switch được biên dịch thành Bảng mã bytecode JVM hoặc lookupswitch yêu cầu các giá trị được sử dụng trong câu lệnh trường hợp đều là thời gian biên dịch và duy nhất.

final int a = 4; // compiler is sure a is initialized 
final int b;// variable b is not guranted to be assigned 

ví dụ: Mặc dù tuyên bố này cuối cùng sẽ khởi tạo b, nhưng trình biên dịch không thể phát hiện nó.

if (a < 4) b= 10; 
if (a >= 4) b = 8 
2

final int b; có thể được gán một lần và giá trị là không chắc chắn, mà sẽ được quyết định trên runtime tùy thuộc vào điều kiện. đó là lý do, ngay cả khi là một biến số cuối cùng, nó không phải là COMPILE TIME không đổi mặc dù nó sẽ là RUN TIME hằng số và trường hợp cần hằng số thời gian biên dịch.

Các vấn đề liên quan