Phạm vi và Truy cập
Đã giới thiệu| English | Ý nghĩa |
|---|---|
| local variable/ˈləʊkl ˈveərɪəbl/ | biến cục bộ |
| scope/skəʊp/ | phạm vi |
| shadows/ˈʃædəʊz/ | che khuất |
Một biến cục bộ reset; một trường nhớ lâu
- Một phương thức tạo ra
int count = 0;, tăng giá trị lên và trả về 1. Gọi phương thức đó hai lần sẽ trả về 1 cả hai lần vì mỗi lần gọi đều có một biến cục bộ mới. - Một phương thức tăng trường của đối tượng thay vào đó sẽ trả về 1 và sau đó là 2 cho cùng một đối tượng ban đầu có giá trị zero. Phân biệt nơi một tên có thể sử dụng được với việc trạng thái được lưu trữ được giữ lại bao lâu.
Phạm vi liên quan đến một tên trong mã nguồn
- Phạm vi của một khai báo là phần của chương trình nơi tên của nó có thể được sử dụng. Một biến cục bộ khối nằm trong phạm vi từ khi khai báo cho đến hết khối còn lại; một biến vòng lặp for không khả dụng sau vòng lặp đó.
- Phạm vi, quyền truy cập và thời gian sống trả lời những câu hỏi khác nhau. Một tên có thể nằm ngoài phạm vi ngay cả khi một đối tượng mà nó từng tham chiếu vẫn có thể truy cập được thông qua một tham chiếu khác; các trường không bị chi phối bởi quy tắc khai báo giống như các biến cục bộ khối.
Khởi tạo biến cục bộ trước khi đọc chúng
- Một biến cục bộ được khai báo trong một phương thức hoặc khối. Java yêu cầu nó phải được gán chắc chắn trước khi giá trị của nó được đọc;
int x; return x;là một lỗi biên dịch, không phải là việc trả về tự động là zero. - Các trường instance nhận giá trị mặc định trong quá trình khởi tạo trước khi các bộ khởi tạo (initializers) và mã constructor chạy. Trong ví dụ, biến count bắt đầu ở 0; trường này thuộc về mỗi đối tượng và tồn tại giữa các lần gọi phương thức của nó.
public class ScopeCounter {
private int count;
public int localCount() {
int count = 0;
count++;
return count;
}
public int rememberedCount() {
count++;
return count;
}
public void setCount(int count) {
this.count = count;
}
public static int readCount(ScopeCounter other) {
return other.count;
}
}
Khái báo cục bộ int x; tự động gán cho x giá trị zero, do đó return x; có thể biên dịch.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Các biến cục bộ phải được gán giá trị chắc chắn trước khi đọc; mặc định của trường không áp dụng cho biến cục bộ.
Một tham số có thể che khuất tên trường
- Tham số
counttrongsetCount(int count)che khuất (shadows) trường đối với các sử dụng không phân định tên của tên đó.count = count;sẽ gán tham số cho chính nó;this.count = count;cập nhật trường của đối tượng nhận. - Một biến cục bộ cũng có thể che khuất một trường, như localCount minh họa. Đừng suy luận rằng mọi khai báo cục bộ trùng lặp đều được phép: khai báo lại một biến cục bộ đã nằm trong phạm vi trong một khối lồng nhau của cùng một phương thức là một lỗi biên dịch.
Phạm vi của một biến là...
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Phạm vi là nơi tên hợp lệ.
Sau khi một lời gọi phương thức thông thường kết thúc, hàm gọi có thể sử dụng biến cục bộ chỉ được khai báo bên trong phương thức đó bằng tên cục bộ của nó không?
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Tên cục bộ không thuộc phạm vi của hàm gọi. Tuy nhiên, một đối tượng được tham chiếu bởi tên cục bộ đó vẫn có thể được trả về và tiếp tục khả kiến.
Loại biến nào nên chứa trạng thái mà đối tượng phải ghi nhớ giữa các lần gọi phương thức?
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Biến thực thể tồn tại suốt đời của đối tượng.
Một tham số có cùng tên với biến thực thể sẽ che khuất (che giấu) biến thực thể đó bên trong phương thức.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Bên trong phương thức, tên đó có nghĩa là tham số; hãy dùng this để truy cập trường dữ liệu.
Khi một tham số che khuất một biến thực thể có cùng tên, người ta nói nó ___ nó (một từ).
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Che khuất ẩn trường dữ liệu phía sau tên cục bộ.
Truy cập phụ thuộc vào lớp khai báo
- Code bên trong ScopeCounter có thể đọc trường count riêng tư của một đối tượng ScopeCounter khác thông qua tham chiếu rõ ràng. Phương thức readCount tĩnh được hiển thị không có
this, nhưngother.countlà hợp lệ cho tham số không null. - Một lớp ngoài không liên quan không thể trực tiếp đọc trường riêng tư đó. Truy cập riêng tư không bị giới hạn ở "chỉ đối tượng của chính tôi"; phương thức thực thể có một người nhận ẩn, trong khi phương thức tĩnh cần một tham chiếu rõ ràng để truy cập trạng thái thực thể.
Đừng kết hợp phạm vi tên, khởi tạo mặc định và truy cập riêng tư thành một quy tắc. Biến cục bộ không tự động bắt đầu bằng không, trường thực thể không thể được đọc không qualifiy từ phương thức tĩnh, và trường riêng tư của một thực thể khác có thể được truy cập bên trong lớp khai báo của nó.
Phạm vi, trạng thái trường và quyền truy cập
Phân biệt giữa khai báo và ngữ cảnh truy cập; một thực thể khác không tự động bị không thể truy cập.
Phương thức đọc count tĩnh được hiển thị có thể đọc other.count khi other khác null.
Độ khó 1/5 · 100 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
Nó sử dụng tham chiếu đối tượng rõ ràng và nằm bên trong lớp khai báo trường riêng tư; không cần this ẩn.
Dự đoán một receiver mới và một đối tượng được trả về
- Sau hai lần gọi rememberedCount trên a, trường của nó là 2; b được tạo mới vẫn có count là 0. Gọi a.localCount() trả về 1 mà không đặt lại trường của a, vì biến đếm cục bộ của nó che khuất trường đó.
- Một phương thức có thể xây dựng một đối tượng trong biến cục bộ và trả về tham chiếu của nó. Tên cục bộ sau đó không khả dụng với người gọi, nhưng đối tượng được trả về có thể vẫn giữ được tính khả tiếp cận; cuối phạm vi của một tên không phá hủy đối tượng đó.
Phạm vi cho biết nơi một tên có thể sử dụng; các biến đổi truy cập kiểm soát quyền hạn; trạng thái đối tượng có thể tồn tại lâu hơn tham chiếu cục bộ. Khởi tạo biến cục bộ trước khi đọc chúng, sử dụng trường cho trạng thái nhớ theo đối tượng, và phân biệt giữa việc che khuất (shadowing) với truy cập trường riêng tư của đối tượng khác.
Đối với ScopeCounter a vừa được tạo mới, hãy gọi a.rememberedCount() hai lần, sau đó a.localCount(). a.localCount() sẽ trả về giá trị gì?
Độ khó 2/5 · 140 xu + một phần thưởng nhỏ cho lần hoàn thành đầu tiên trong ngày
localCount có một biến đếm cục bộ mới được khởi tạo bằng không; nó tăng và trả về 1 mà không thay đổi trường dữ liệu.