Phạm vi của biến trong Java

Người dịch : Nguyễn Minh Tuấn
Email liên hệ : tuann.nm241@gmail.com
Bài viết gốc : https://www.baeldung.com/java-variable-scope

1. Tổng quan

Biến (variable) trong Java hay bất kì ngôn ngữ nào cũng đều có phạm vi sử dụng. Phạm vi sử dụng của biến chính là những nơi mà biến đó có thể sử dụng hợp lệ.

2.Class Scope

Biến mà được khai báo bên trong class và bên ngoài method với access modifier là private thì có phạm vi sử dụng (scope) là bên trong class đó.

public class ClassScopeExample {
    private Integer amount = 0;
    public void exampleMethod() {
        amount++;
    }
    public void anotherExampleMethod() {
        Integer anotherAmount = amount + 4;
    }
}

Chúng ta có thể thấy ClassScopeExample có biến amount có phạm vi sử dụng là class scope, vì thế những method bên trong class ClassScopeExample đều có thể sử dụng biến amount.
Nếu chúng ta không sử dụng private access modifier cho amount thì biến này có thể truy cập trong toàn bộ package . Các bạn muốn tìm hiểu về access modifier thì có thể xem thêm tại đây .

3. Method Scope

Khi một biến được khai báo bên trong method thì biến đó chỉ có thể sử dụng bên trong method mà nó được khai báo.

public class MethodScopeExample {
    public void methodA() {
        Integer area = 2;
    }
    public void methodB() {
        // compiler error, area cannot be resolved to a variable
        area = area + 2;
    }
}

4. Loop Scope

Nếu chúng ta khai báo biến trong vòng lặp, thì biến đó chỉ có phạm vi sử dụng là bên trong vòng lặp đó.

public class LoopScopeExample {
    List<String> listOfNames = Arrays.asList("Joe", "Susan", "Pattrick");
    public void iterationOfNames() {
        String allNames = "";
        for (String name : listOfNames) {
            allNames = allNames + " " + name;
        }
        // compiler error, name cannot be resolved to a variable
        String lastNameUsed = name;
    }
}

Trong đoạn code trên chúng ta có thể thấy method interationOfName có biến name và biến này chỉ có thể sử dụng bên trong vòng lặp.

5. Bracket Scope

Chúng ta có thể định nghĩa scope thông qua cặp dấu {}.

public class BracketScopeExample {    
    public void mathOperationExample() {
        Integer sum = 0;
        {
            Integer number = 2;
            sum = sum + number;
        }
        // compiler error, number cannot be solved as a variable
        number++;
    }
}

6. Scopes and Variable Shadowing

Giả sử rằng chúng ta có 1 biến có class scope và chúng ta muốn khai báo thêm 1 biến có method scope và trùng tên với biến class scope. Trong ví dụ này chính là biến name:

public class NestedScopesExample {
    String title = "Techmaster";
    public void printTitle() {
        System.out.println(title); // print1
        String title = "John Doe";
        System.out.println(title); //print2
    }
}

Khi chạy chương trình , trước tiên sẽ thực hiện print1 , và giá trị in ra sẽ là Techmaster.
Sau đó , chúng ta khai báo 1 biến method scope với tên là title và gán giá trị là John Doe . Vì vậy, khi thực hiện print2, kết quả in ra sẽ là John Doe. Đó được gọi là variable shadowing . Tuy nhiên cách đặt trùng tên biến này sẽ không được khuyến khích vì nó rất dễ gây nhầm lẫn.

7. Tổng kết

Trong bài viết này, chúng ta đã tìm hiểu về sự khác nhau giữa các phạm vi của biến trong Java.
Hy vọng bài viết sẽ giúp ích cho quá trình học tập của các bạn.