2014-11-30 16 views
5

Tôi đã trải qua một thử nghiệm trên itester.org và tìm thấy một câu hỏi mà tôi không hiểu:Tại sao biến Integer được gán null theo mặc định?

public class Runner 
{ 
    public static Integer i; 

    public static void main(String[] args) 
    { 
     if (i == 42) { 
      System.out.printf("wow"); 
     } 
    } 
} 

tôi đọc trước đây, rằng biến số nguyên được gán theo mặc định 0. Tại sao nó được gán null ở đây?

+3

Bởi vì nó không phải là một nguyên thủy, nhưng là một đối tượng. Giá trị mặc định cho một đối tượng là null. Khi bạn đang làm 'i == 42', nó cố gắng unbox giá trị int trong' i' nhưng vì 'i' là null, bạn nhận được một NPE. –

+0

Gotta yêu Java - nó làm cho * rất nhiều ý nghĩa rằng int và Integer là các kiểu dữ liệu khác nhau. – Craig

Trả lời

7

Bất kỳ loại tham chiếu nào (ví dụ: bất kỳ biến nào có loại là Object hoặc một lớp con của đối tượng) đều có giá trị mặc định là null. Điều này bao gồm Integer.

Các nguyên thủy int, mặt khác, có một giá trị mặc định là 0.

1

Tất cả các biến phi địa phương phi nguyên thủy được gán cho null, nếu không được chỉ định rõ ràng.

5

JLS 4.12.5. Initial Values of Variables:

Đối với tất cả các loại tài liệu tham khảo (§4.3), giá trị mặc định là null.

Và kể từ Integer là một tham khảo loại, nó được null:

ReferenceType: 
    ClassOrInterfaceType 
    TypeVariable 
    ArrayType 

Xem các liên kết với nhiều loại khác

5

Các nguyên thủy int loại được gán 0 theo mặc định, nhưng tham chiếu Integer được gán theo mặc định. Integer là một wrapper class - đó là một đối tượng, không phải là loại nguyên thủy.

Bạn có thể muốn đọc khoảng autoboxing and unboxing trong Java, quá trình mà Java tự động chuyển đổi giữa các kiểu nguyên thủy và các lớp trình bao bọc.

1

Số nguyên là lớp bao bọc và trong mẫu mã này tôi là biến tham chiếu. Tất cả các biến tham chiếu trong java theo giá trị null mặc định và tất cả kiểu nguyên thủy có giá trị mặc định của nó (ví dụ int i -> 0)

Sử dụng: - Riêng int tĩnh; sau đó nó có giá trị 0 mặc định.

3

Trong Java Integer là một loại đối tượng. Trong mã mẫu này, bạn cần loại nguyên thủy là int. Trong Java bất kỳ loại đối tượng/loại tham chiếu hoặc bất kỳ loại phụ của loại biến đối tượng mà không được khởi tạo tự động được khởi tạo bởi null. Trong trường hợp kiểu nguyên thủy có giá trị mặc định.

Lý do đằng sau điều này là, Đối tượng cung cấp cơ sở cho đa hình, được chuyển bằng tham chiếu (hoặc chính xác hơn có tham chiếu được truyền theo giá trị) và được phân bổ từ vùng heap. Ngược lại, nguyên thủy là các loại bất biến được truyền theo giá trị và thường được phân bổ từ ngăn xếp.

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