Tại sao cần phải khởi tạo giá trị cho biến khi biến đó có phạm vi là local

       void X(){
        int a;
        System.out.println(a);
    }

==> Lỗi compile do biến a chưa được khởi tạo giá trị mặc định mà System.out.println đã sử dụng a.

    void X(){
        int a;
    }

==> Chỉ khai báo a, không sử dụng như này thì không lỗi.


Anh/chị giải thích giúp em cơ chế hoạt động với! Tại sao nếu a là instance variable thì lại có default value là 0 còn trường hợp nó là biến local thì lại không có default value? Em cảm ơn nhiều.

Về việc không khởi tạo giá trị cho biến local, theo như specification của Java, mục “introduction”

Chapter 16 describes the precise way in which the language ensures that local variables are definitely set before use. While all other variables are automatically initialized to a default value, the Java programming language does not automatically initialize local variables in order to avoid masking programming errors.

Việc không khởi tạo default value cho local variable là để tránh việc gặp các lỗi tiềm tàng, chẳng hạn khi biến local có thể chứa giá trị rác như trong C.
Trong spec trên, chapter 16 cũng nói rõ:

Every local variable declared by a statement (§14.4.2, §14.14.1, §14.14.2, §14.20.3) and every blank final field (§4.12.4, §8.3.1.2) must have a definitely assigned value when any access of its value occurs.

Về khía cạnh tính năng của compiler, cậu cũng hoàn toàn có thể check được biến local có được khởi tạo hay không, vì biến đó chỉ tồn tại trong scope của method đó thôi.

Về việc giá trị default được gán cho các biến instance variable, điều đó cũng được ghi trong spec, mục 4.10.5

Each class variable, instance variable, or array component is initialized with a default value when it is created

Lý do cho việc đó, tớ đoán là việc compiler không thể biết được biến instance variable được khởi tạo khi nào (nó có thể được khởi tạo ở bất cứ thời điểm nào, ở bất cứ nơi đâu. Kể cả private property cậu cũng có thể dùng reflection để khởi tạo thuộc tính ở bất cứ nơi nào). Vậy nên, gán giá trị default sẽ hợp logic hơn.

Hope it helps!

See also:

4 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?