2011-10-09 36 views
7

thể trùng lặp:
Why inner classes require “final” outer instance variables [Java]?
Why are only final variables accessible in anonymous class?Phương thức lớp nội bộ cục bộ chỉ có thể truy cập biến cục bộ cuối cùng. Tại sao?

class Outer{ 
    private String x = "instance variable"; 
    void doStuff(){ 
     String z = "local variable"; 
     class Inner{ 
      public void seeOuter(){ 
      System.out.println("Outer x is : "+ x); 
      System.out.println("Local variable z is : " + z); //won't compile 
     } 
     } 
    } 
} 

Đánh dấu z biến cục bộ như sửa lỗi chính thức vấn đề:

final String z = "local variable"; //Now inner object can use it. 


Có ai vui lòng giải thích điều gì đang xảy ra không?

Tôi biết chính xác lý do tại sao nó không thể biên dịch trong trường hợp tôi đang cố truy cập biến cục bộ không phải cuối cùng.

Việc tạo kết quả biến cục bộ cho phép nó vẫn hoạt động ngay cả khi phương thức được hoàn thành và biến cục bộ nằm ngoài phạm vi?

Biến cục bộ cuối cùng có được lưu trữ trên một đống thay vì ngăn xếp không?

Trả lời

2

Đánh dấu biến cục bộ z là sửa lỗi cuối cùng vấn đề: Bất cứ ai có thể giải thích điều gì đang xảy ra không?

Bạn có một phương thức lớp địa phương được phép truy cập biến cục bộ cuối cùng trong phạm vi được tạo.

Việc tạo kết quả biến cục bộ cho phép nó vẫn hoạt động ngay cả khi phương pháp được hoàn thành và biến cục bộ nằm ngoài phạm vi?

cuối cùng có nghĩa là không thể thay đổi. Không có gì khác.

Biến cục bộ cuối cùng có được lưu trữ trên một đống thay vì ngăn xếp không?

Tất cả các biến được phân bổ trên ngăn xếp, cuối cùng hay không.

Tôi biết chính xác lý do tại sao nó không thể biên dịch trong trường hợp tôi đang cố truy cập biến cục bộ không phải cuối cùng.

Có lẽ bạn nên suy nghĩ về điều này vì nó không rõ ràng với tôi rằng đây là trường hợp nào cả.

Lớp lồng nhau có thể "truy cập" biến cuối cùng vì chúng được sao chép dưới dạng trường của đối tượng một cách tự động. Nó không hỗ trợ các trường không cuối cùng vì chúng có thể được thay đổi, hoặc bằng phương thức hoặc lớp và điều này không được hỗ trợ bởi vì trên thực tế có hai trường/biến khác nhau.

+0

: nhưng câu hỏi ở đây là lý do tại sao đánh dấu một biến phương pháp cục bộ cuối cùng làm cho nó có thể truy cập? – Anu11

+0

@ Anu11 Tôi sẽ đọc đoạn cuối cùng một lần nữa. ;) –

10

Chúng có thể sử dụng các biến cục bộ và tham số của hàm, nhưng chỉ có các biến được khai báo final, vì cá thể lớp cục bộ phải duy trì một bản sao riêng biệt .Vì vậy, như không có sự nhầm lẫn của hai biến có thể sửa đổi với cùng tên trong cùng một phạm vi, biến được buộc phải không thể sửa đổi được.

+1

"vì nó có thể tồn tại chức năng", mới đến java và không thể hiểu được phần này, bạn có thể giải thích một kịch bản mà điều này có thể xảy ra không? Cảm ơn – RVP

+2

Giả sử thể hiện lớp bên trong được chuyển thành đối số phương thức và được lưu trữ dưới dạng biến mẫu của một đối tượng khác. Mặc dù biến phương thức chết khi hoàn thành phương thức METHOD, đối tượng lớp INNER đã loại bỏ phương thức –

+0

"vì cá thể lớp cục bộ phải duy trì một bản sao riêng biệt của biến" - làm các cá thể lớp cục bộ duy trì truy cập vào tất cả các biến trong phạm vi đó? Có bất kỳ điều gì trong tài liệu để hỗ trợ điều này hay bất kỳ chương trình thử nghiệm nào không? Tôi có nghĩa là làm thế nào để chúng ta biết rằng các lớp bên trong địa phương có được một bản sao của các biến địa phương? – Solace

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