ค่าเริ่มต้นของ 'boolean' และ 'Boolean' ใน Java


คำตอบ:



390

ค่าเริ่มต้นของใด ๆObjectเช่นเป็นBooleannull

ค่าเริ่มต้นสำหรับ a booleanเป็นเท็จ

หมายเหตุ:ดั้งเดิมทุกคนมีคลาส wrapper nullทุกเสื้อคลุมใช้อ้างอิงซึ่งมีค่าเริ่มต้นของ Primitives มีค่าเริ่มต้นที่แตกต่างกัน:

boolean -> false

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

float, double -> 0.0

หมายเหตุ (2): voidมีเสื้อคลุมVoidซึ่งมีค่าเริ่มต้นnullและเป็นเพียงค่าที่เป็นไปได้ (โดยไม่ใช้แฮ็ก)


2
ฉันคิดว่าจะพูดถึงBooleanก็คือObjectว่าจะทำให้ความหมายบรรทัดแรกชัดเจน ฟังดูธรรมดา แต่สำหรับคนที่ถามคำถามพื้นฐานเช่นนี้อาจช่วยได้
Suma


17

ถ้าคุณต้องการถามคุณต้องเริ่มต้นเขตข้อมูล / ตัวแปรของคุณอย่างชัดเจนเพราะถ้าคุณต้องค้นหามันก็มีโอกาสที่คนอื่นจะต้องทำเช่นนั้น

คุ้มค่าสำหรับดั้งเดิมbooleanเป็นเท็จที่สามารถเห็นได้ที่นี่

ตามที่ผู้อื่นกล่าวถึงค่าสำหรับ a Booleanจะเป็นโมฆะโดยค่าเริ่มต้น


ขอบคุณสำหรับการอ้างอิงถึงแหล่งข้อมูลอย่างเป็นทางการ สำหรับการเริ่มต้นนั้นไม่จำเป็นต้องชดเชยความรู้ที่ขาดไป
LoBo

2
'การขาดความรู้' หมายความว่ามีระดับที่คาดหวังในการเปรียบเทียบ หากระดับความรู้ขั้นต่ำนี้ชัดเจนฉันก็เห็นด้วย ถ้าไม่ฉันก็พบว่ารอบคอบที่จะทำผิดพลาดมากขึ้น ทั้งหมดนี้เป็นการตัดสินใจ / ความเห็นส่วนตัว / ทีมค่อนข้างมาก
Peter Tillemans

4
@LoBo - ฉันคิดว่าไม่มีอะไรผิดปกติที่จะชดเชยกับการขาดความรู้ที่อาจเกิดขึ้น คุณไม่รู้ว่าใครจะเป็นผู้ดูแลรหัสของคุณ อะไรก็ตามที่ทำให้โค้ดของคุณเข้าใจได้ง่ายขึ้นและ / หรือสามารถอ่านได้ในขณะที่มีผลกระทบต่อประสิทธิภาพเพียงเล็กน้อยก็อาจเป็นเรื่องดี
ferekdoley

9

บูลีนเป็นวัตถุ ดังนั้นถ้ามันเป็นตัวแปรอินสแตนซ์มันจะเป็นโมฆะ ถ้ามันถูกประกาศในวิธีการคุณจะต้องเริ่มต้นมันหรือจะมีข้อผิดพลาดของคอมไพเลอร์

หากคุณประกาศว่าเป็นดั้งเดิมเช่นบูลีน ค่าจะเป็นเท็จโดยค่าเริ่มต้นหากเป็นตัวแปรอินสแตนซ์ (หรือตัวแปรคลาส) ถ้ามันถูกประกาศภายในเมธอดคุณจะยังคงต้องเริ่มต้นเป็นจริงหรือเท็จหรือจะมีข้อผิดพลาดคอมไพเลอร์


6

เตรียมBooleanสมาชิก (ที่จริงมีการอ้างอิงถึงวัตถุของการพิมพ์Boolean) nullจะมีค่าเริ่มต้นของ

uninitialized boolean(ดั้งเดิม) falseสมาชิกจะมีค่าเริ่มต้นของ


4

Booleanไม่มีค่าเริ่มต้นคือ Booleanจะต้องมีการสร้างด้วยหรือboolean Stringถ้าวัตถุที่ถูก unintialized nullก็จะชี้ไปที่

ค่าเริ่มต้นของดั้งเดิมคือbooleanfalse

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


ฉันคิดว่า 3 downvote นั้นเป็นเพราะคุณพูดว่า "ไม่มีค่าเริ่มต้น" ซึ่งเป็นคำสั่งที่ไม่ชัดเจน อย่างที่คุณพูดจุดอ้างอิงวัตถุที่ไม่มีจุดnullเริ่มต้น nullเป็นค่าเริ่มต้นดังนั้นฉันไม่แน่ใจว่าสิ่งที่คุณอ้างถึงเมื่อคุณพูดว่าไม่มี คุณอาจหมายถึงบางสิ่งเช่น " Booleanไม่ใช่trueหรือfalseโดยเริ่มต้น"?)
Radiodef

ใช่สิ่งที่คุณใส่มีความแม่นยำมากกว่า มีคำตอบที่ได้รับการยอมรับซึ่งมีความรัดกุมมากกว่าอยู่แล้ว ฉันไม่แน่ใจว่าสิ่งใดที่ได้จากการลงโพสต์และการแก้ไข
Stealth Rabbi

1
เพื่อชี้แจงฉันไม่ได้ลงคะแนนและการแก้ไขของฉันไม่เกี่ยวข้องกับความคิดเห็นของฉันอย่างสมบูรณ์ ฉันขอแนะนำให้แก้ไขคำตอบถ้าคุณเห็นด้วยกับการใช้ถ้อยคำที่แนะนำนั้นและจากนั้นเราสามารถลบความคิดเห็นของเราเพื่อล้างข้อมูล
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;
    }
}

เอาท์พุท:

primitive: false
object: null

ดูเหมือนว่าจะเห็นได้ชัด แต่ฉันมีสถานการณ์ที่แจ็กสันในขณะที่ทำให้วัตถุเป็นอนุกรมกับ JSON กำลังขว้าง NPE หลังจากเรียกผู้ทะเยอทะยานเช่นเดียวกับสถานการณ์นี้ที่ส่งคืนบูลีนดั้งเดิมที่ไม่ได้รับมอบหมาย สิ่งนี้ทำให้ฉันเชื่อว่าแจ็คสันได้รับโมฆะและพยายามเรียกวิธีการเกี่ยวกับมันดังนั้น NPE ฉันผิดไป.

คุณธรรมของเรื่องราวคือเมื่อ Java จัดสรรหน่วยความจำสำหรับดึกดำบรรพ์หน่วยความจำนั้นมีค่าแม้ว่าจะไม่ได้กำหนดค่าเริ่มต้นซึ่ง Java เท่ากับค่าเท็จสำหรับบูลีน ในทางตรงกันข้ามเมื่อจัดสรรหน่วยความจำสำหรับวัตถุที่ซับซ้อนที่ไม่ได้กำหนดค่าเริ่มต้นเช่นบูลีนมันจะจัดสรรพื้นที่สำหรับการอ้างอิงไปยังวัตถุนั้นไม่ใช่วัตถุเอง - ไม่มีวัตถุในหน่วยความจำที่จะอ้างถึง - ดังนั้นการแก้ไขผลการอ้างอิงนั้น

ฉันคิดว่าการพูดอย่างเคร่งครัดว่า "ค่าเริ่มต้นเป็นเท็จ" นั้นเป็นเพียงเล็กน้อย ฉันคิดว่า Java ไม่ได้จัดสรรหน่วยความจำและกำหนดค่าเป็นเท็จจนกว่าจะมีการตั้งค่าไว้อย่างชัดเจน ฉันคิดว่า Java จัดสรรหน่วยความจำและค่าอะไรก็ตามที่หน่วยความจำเกิดขึ้นมีเหมือนกันกับค่าของ 'เท็จ' แต่สำหรับการปฏิบัติพวกเขาเป็นสิ่งเดียวกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.