Bỏ qua để đến nội dung

Phạm vi biến (Scope)

Một biến cục bộ chỉ tồn tại và có thể dùng được bên trong khối lệnh ({}) nơi nó được khai báo - ra khỏi khối đó, biến “biến mất”:

public static void main(String[] args) {
int x = 10;
if (x > 5) {
int y = 20; // y chỉ tồn tại trong khối if này
System.out.println(x + y); // OK - x và y đều truy cập được
}
System.out.println(y); // LỖI BIÊN DỊCH! y không tồn tại ngoài khối if
}

Biến khai báo trong phần khởi tạo của for chỉ tồn tại trong vòng lặp đó:

for (int i = 0; i < 5; i++) {
System.out.println(i);
}
System.out.println(i); // LỖI BIÊN DỊCH! i không tồn tại ngoài vòng lặp for

3. Tham số cũng có phạm vi trong thân phương thức

Phần tiêu đề “3. Tham số cũng có phạm vi trong thân phương thức”
static void greet(String name) {
System.out.println("Xin chào " + name);
}
// name chỉ tồn tại bên trong greet(), không truy cập được ở nơi khác

4. Java KHÔNG cho phép “che khuất” biến cục bộ (shadowing)

Phần tiêu đề “4. Java KHÔNG cho phép “che khuất” biến cục bộ (shadowing)”

⚠️ Khác với một số ngôn ngữ khác, Java không cho phép khai báo một biến cục bộ trùng tên với một biến cục bộ khác đang còn trong phạm vi bao quanh - đây là lỗi biên dịch, không phải hành vi ngầm định cho phép:

public static void main(String[] args) {
int x = 10;
if (x > 5) {
int x = 20; // LỖI BIÊN DỊCH! x đã tồn tại trong phạm vi bao quanh (main)
}
}

Điều này giúp tránh những lỗi khó phát hiện do nhầm lẫn biến “trong” và biến “ngoài” cùng tên - trình biên dịch buộc bạn phải đặt tên khác nếu thực sự cần một biến mới.

Các biến khai báo trực tiếp trong một lớp (gọi là field, không nằm trong phương thức nào) có phạm vi rộng hơn - tồn tại suốt vòng đời đối tượng (hoặc suốt chương trình nếu là static). Field được phép trùng tên với biến cục bộ bên trong phương thức (biến cục bộ sẽ “che” field cùng tên trong phạm vi của nó). Chi tiết về field và cách nó khác biến cục bộ sẽ được học ở phần Hướng đối tượng (OOP).

  • Biến cục bộ chỉ tồn tại trong khối lệnh {} nơi nó được khai báo
  • Biến khởi tạo trong for chỉ tồn tại trong vòng lặp đó
  • Java không cho phép khai báo biến cục bộ trùng tên với biến cục bộ khác đang còn trong phạm vi bao quanh - lỗi biên dịch, khác với field của lớp