Uninitialized Object เทียบกับ Object ที่เริ่มต้นเป็น NULL


93

ฉันทำงานใน Java

ฉันมักจะตั้งค่าวัตถุบางอย่างเช่นนี้:

public class Foo {
    private SomeObject someName;

    // do stuff

    public void someMethod() {
        if (this.someName != null) {
            // do some stuff
        }
    }
}

คำถามคือ: someNameในตัวอย่างนี้เท่ากับnullหรือไม่ในขณะที่ฉันสามารถreliably for all objectsสมมติว่าการตรวจสอบค่า null อ็อบเจ็กต์ที่ไม่ได้กำหนดค่าเริ่มต้นจะถูกต้องหรือไม่

คำตอบ:


115

ถูกต้องทั้งสมาชิกสแตติกและอินสแตนซ์ของชนิดการอ้างอิงที่ไม่ได้เตรียมใช้งานอย่างชัดเจนถูกตั้งค่าเป็น nullโดย Java กฎเดียวกันนี้ใช้กับสมาชิกอาร์เรย์

จากข้อกำหนดภาษา Javaส่วน 4.12.5:

ค่าเริ่มต้นของตัวแปร

ทุกตัวแปรในโปรแกรมต้องมีค่าก่อนที่จะใช้ค่า:

ตัวแปรคลาสตัวแปรอินสแตนซ์หรือส่วนประกอบอาร์เรย์แต่ละตัวจะเริ่มต้นด้วยค่าเริ่มต้นเมื่อสร้างขึ้น

[ ... ] nullเหมาะสำหรับทุกสภาพการอ้างอิงค่าเริ่มต้นคือ

โปรดทราบว่ากฎข้างต้นไม่รวมตัวแปรภายใน: ต้องเริ่มต้นอย่างชัดเจนมิฉะนั้นโปรแกรมจะไม่คอมไพล์


วิธีนี้ใช้กับตัวอย่างเช่นchar? ฉันทำได้char test;แต่ทำไม่ได้char test = null;
xorinzor

1
@xorinzor คุณไม่สามารถกำหนดnullให้ได้charเนื่องจากเป็นประเภทดั้งเดิม นอกจากนี้คุณไม่สามารถทำได้char test;ภายในวิธีการโดยไม่กำหนดในtestภายหลัง คุณสามารถทำได้char test='a'หากต้องการหรือปล่อยไว้char test;ในประกาศสมาชิกเพื่อรับค่าเริ่มต้นของ'\0'.
Sergey Kalinichenko

14

หากมีObjectการอ้างอิงได้รับการประกาศ แต่ไม่ instantiated nullค่าของมันคือ


8
เป็นฟิลด์อินสแตนซ์ของคลาสเท่านั้น
Sotirios Delimanolis

1
@SotiriosDelimanolis ช่วยอธิบายหน่อยได้ไหม? ฉันพยายามเรียนรู้ :)
SnakeDoc

5
@SnakeDoc หากคุณประกาศ Object ในตัวเมธอดคุณจะได้รับข้อผิดพลาดในการคอมไพล์หากคุณพยายามใช้โดยไม่ได้เริ่มต้นก่อน
Sotirios Delimanolis

9
มันคุ้มค่าที่จะแม่นยำที่นี่ - คุณไม่เคยประกาศวัตถุ คุณประกาศตัวแปร ไม่ใช่สิ่งเดียวกัน
Jon Skeet

7
@SotiriosDelimanolis ขออภัยที่นำการอภิปรายเก่า ๆ มาใช้ แต่คุณมีข้อมูลอ้างอิงหรือไม่ว่าเหตุใดพวกเขาจึงตัดสินใจว่าควรทำให้เกิดข้อผิดพลาดในการคอมไพล์แทนที่จะเริ่มต้นให้nullเหมือนกับฟิลด์อินสแตนซ์
childofsoong

-1
namespace Design
     {
              class Program
              {

                static void Main(string[] args)
                {
                  Logger obj1;   // By Default, the value of obj1 is null
                  Logger obj2 = new Logger();  // By Default the value of obj2 is 
                                               // Design.Logger which is not null
                  Console.WriteLine(obj2); 
                  Console.Read();
                }
              }

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