2015-01-09 15 views
5

JLS 8.1.3 cho chúng ta quy tắc về các biến không được khai báo trong lớp bên trong mà được sử dụng trong lớp.Việc sử dụng biến cục bộ không phải cuối cùng trong một lớp bên trong

Bất kỳ biến địa phương, thông số chính thức, hoặc tham số ngoại lệ được sử dụng nhưng không khai báo trong một lớp bên phải hoặc được công bố chính thức hoặc được hiệu quả cuối cùng (§4.12.4), hoặc một lỗi thời gian biên dịch xảy ra ở đâu sử dụng .

Một ví dụ:

class A{ 
    void baz(){ 
     int i = 0; 
     class Bar{ int j = i; } 
    } 

    public static void main(String[] args){ 
    } 
} 

DEMO

Tại sao mã biên dịch? Chúng tôi đã sử dụng biến cục bộ không phải cuối cùng trong lớp bên trong mà không được khai báo trong đó.

Trả lời

2

Biến số i được xác định bên trong phương thức baz là kết quả cuối cùng vì giá trị của biến i không bị sửa đổi ở nơi khác. Nếu bạn thay đổi nó

void baz(){ 
     int i = 0; 
     i = 2; 
     class Bar{ int j = i; } 
    } 

Mã sẽ không biên dịch vì biến i không còn effictively thức nhưng nếu bạn chỉ cần khai báo biến i và khởi tạo nó phù hợp khác, mã sẽ biên dịch vì biến là effictively final

void baz(){ 
     int i; 
     i = 2; 
     class Bar{ int j = i; } 
    } 
1

i là hiệu quả cuối cùng, vì nó không bao giờ được sửa đổi. Như bạn đã tự trích dẫn JLS, lớp bên trong có thể sử dụng các biến cuối cùng hiệu quả.

1

i có hiệu quả cuối cùng vì nó không bị thay đổi trong baz.

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