Giá trị mặc định của 'boolean' và 'Boolean' trong Java


260

Các giá trị mặc định của boolean(nguyên thủy) và Boolean(trình bao bọc nguyên thủy) trong Java là gì?

Câu trả lời:



390

Giá trị mặc định của bất kỳ Object, chẳng hạn như Boolean, là null.

Giá trị mặc định cho a booleanlà sai.

Lưu ý: Mỗi nguyên thủy có một lớp bao bọc. Mỗi trình bao bọc sử dụng một tham chiếu có mặc định là null. Nguyên thủy có các giá trị mặc định khác nhau:

boolean -> false

byte, char, short, int, long -> 0

float, double -> 0.0

Lưu ý (2): void có một trình bao bọc Voidcũng có mặc định nullvà đó chỉ là giá trị có thể (không sử dụng hack).


2
Tôi nghĩ rằng người ta có thể đề cập đến Booleanđược Object, mà có thể làm dòng đầu tiên có nghĩa là rõ ràng. Điều này nghe có vẻ khá cơ bản, nhưng đối với ai đó hỏi một câu hỏi cơ bản như thế này thì có thể giúp ích.
Suma

23

boolean
Có thể truehoặc false.
Giá trị mặc định là false.

(Nguồn: Biến nguyên thủy Java )

Boolean
Có thể là một Booleanđối tượng đại diện truehoặc false, hoặc có thể null.
Giá trị mặc định là null.


17

Nếu bạn cần hỏi, thì bạn cần phải khởi tạo một cách rõ ràng các trường / biến của mình, bởi vì nếu bạn phải tìm kiếm nó, thì rất có thể người khác cũng cần phải làm điều đó.

Giá trị cho một nguyên thủy booleanlà sai như có thể được nhìn thấy ở đây .

Như được đề cập bởi những người khác, giá trị cho a Booleansẽ là null theo mặc định.


Cảm ơn bạn đã tham khảo nguồn chính thức. Khi khởi tạo, không cần phải bù đắp cho sự thiếu hụt kiến ​​thức.
LoBo

2
"Thiếu kiến ​​thức" ngụ ý rằng có một số mức độ mong đợi để so sánh với. Nếu mức độ kiến ​​thức tối thiểu này là rõ ràng, tôi đồng ý. Nếu không, tôi thấy nó là khôn ngoan để sai lầm rõ ràng hơn. Trong tất cả điều này là một quyết định / ý kiến ​​cá nhân / nhóm khá.
Peter Tillemans

4
@LoBo - Tôi nghĩ không có gì sai khi bù đắp cho sự thiếu hụt kiến ​​thức tiềm năng. Bạn không biết ai sẽ duy trì mã của bạn. Bất cứ điều gì làm cho mã của bạn dễ hiểu và / hoặc dễ đọc hơn, trong khi có ít ảnh hưởng đến hiệu suất, chỉ có thể là một điều tốt.
ferekdoley

9

Boolean là một đối tượng. Vì vậy, nếu đó là một biến thể, nó sẽ là null. Nếu nó được khai báo trong một phương thức, bạn sẽ phải khởi tạo nó, hoặc sẽ có lỗi trình biên dịch.

Nếu bạn khai báo là một nguyên thủy tức là boolean. Giá trị sẽ là sai theo mặc định nếu đó là một biến thể hiện (hoặc biến lớp). Nếu nó được khai báo trong một phương thức, bạn vẫn sẽ phải khởi tạo nó thành đúng hoặc sai hoặc sẽ có lỗi trình biên dịch.


6

Một Booleanthành viên chưa được khởi tạo (thực sự là một tham chiếu đến một đối tượng thuộc loại Boolean) sẽ có giá trị mặc định là null.

Một booleanthành viên chưa được khởi tạo (nguyên thủy) sẽ có giá trị mặc định là false.


4

Không có mặc định cho Boolean. Booleanphải được xây dựng với a booleanhoặc a String. Nếu đối tượng là không xác định, nó sẽ trỏ đếnnull .

Giá trị mặc định của nguyên thủy booleanfalse .

http://doad.oracle.com/javase/6/docs/api/java/lang/Boolean.html
https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html


Tôi nghĩ rằng 3 downvote đó là bởi vì bạn nói "không có mặc định" đó là một tuyên bố khá không rõ ràng. Như bạn nói, một tham chiếu đối tượng chưa được khởi tạo tới null. nulllà mặc định, vì vậy tôi không chắc bạn đang đề cập đến điều gì khi bạn nói không có. (Bạn có thể có nghĩa gì đó như " Booleankhông phải truecũng không phải falsemặc định" không?)
Radiodef

Vâng, những gì bạn đặt là chính xác hơn. Đã có một câu trả lời được chấp nhận ngắn gọn hơn. Tôi không chắc những gì đạt được bằng cách hạ thấp một bài đăng và chỉnh sửa nó.
Rabbi tàng hình

1
Để làm rõ, tôi đã không downvote và chỉnh sửa của tôi hoàn toàn không liên quan đến nhận xét của tôi. Tôi khuyên bạn nên chỉnh sửa câu trả lời nếu bạn chấp thuận cụm từ được đề xuất đó và sau đó chúng tôi có thể xóa nhận xét của mình để dọn dẹp.
Radiodef

1
class BooleanTester
{
    boolean primitive;
    Boolean object;

    public static void main(String[] args) {
        BooleanTester booleanTester = new BooleanTester();
        System.out.println("primitive: " + booleanTester.getPrimitive());
        System.out.println("object: " + booleanTester.getObject());
}

    public boolean getPrimitive() {
        return primitive;
    }

    public Boolean getObject() {
        return object;
    }
}

đầu ra:

primitive: false
object: null

Điều này có vẻ hiển nhiên nhưng tôi đã gặp phải tình huống Jackson, trong khi tuần tự hóa một đối tượng thành JSON, đã ném NPE sau khi gọi một getter, giống như trường hợp này, trả về một boolean nguyên thủy không được gán. Điều này khiến tôi tin rằng Jackson đã nhận được null và cố gắng gọi một phương thức trên đó, do đó là NPE. Tôi đã sai.

Đạo đức của câu chuyện là khi Java phân bổ bộ nhớ cho một nguyên thủy, bộ nhớ đó có một giá trị ngay cả khi không được khởi tạo, mà Java tương đương với sai cho boolean. Ngược lại, khi phân bổ bộ nhớ cho một đối tượng phức tạp chưa được khởi tạo như Boolean, nó chỉ phân bổ không gian cho một tham chiếu đến đối tượng đó, chứ không phải chính đối tượng - không có đối tượng nào trong bộ nhớ để tham chiếu - vì vậy việc giải quyết kết quả tham chiếu đó là null.

Tôi nghĩ rằng nói đúng ra, "mặc định là sai" là một chút sai lầm. Tôi nghĩ rằng Java không phân bổ bộ nhớ và gán cho nó một giá trị sai cho đến khi nó được đặt rõ ràng; Tôi nghĩ rằng Java phân bổ bộ nhớ và bất kỳ giá trị nào mà bộ nhớ xảy ra đều giống như giá trị của 'false'. Nhưng với mục đích thực tế, chúng là cùng một thứ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.