Objek yang tidak diinisialisasi vs Objek yang diinisialisasi ke NULL


93

Saya bekerja di Jawa.

Saya biasanya mengatur beberapa objek seperti:

public class Foo {
    private SomeObject someName;

    // do stuff

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

Pertanyaannya adalah: Apakah someNamedalam contoh ini disamakan dengan null, seperti-in saya dapat reliably for all objectsberasumsi bahwa pengecekan null objek yang tidak diinisialisasi akan akurat?

Jawaban:


115

Benar, anggota statis dan instance dari tipe referensi yang tidak diinisialisasi secara eksplisit disetel ke nullJava. Aturan yang sama berlaku untuk anggota array.

Dari Spesifikasi Bahasa Java , bagian 4.12.5:

Nilai Awal Variabel

Setiap variabel dalam program harus memiliki nilai sebelum nilainya digunakan:

Setiap variabel kelas, variabel instance, atau komponen array diinisialisasi dengan nilai default saat dibuat

[...] Untuk semua jenis referensi, nilai defaultnya adalah null.

Perhatikan bahwa aturan di atas mengecualikan variabel lokal: mereka harus diinisialisasi secara eksplisit, jika tidak program tidak akan dikompilasi.


bagaimana ini berlaku untuk, misalnya char,? Saya bisa melakukannya char test;tetapi tidakchar test = null;
— xorinzor

1
@xorinzor Anda tidak dapat menetapkan nulluntuk charkarena merupakan tipe primitif. Anda juga tidak dapat melakukannya char test;di dalam metode tanpa menetapkan testnanti. Anda dapat melakukannya char test='a'jika Anda mau, atau membiarkannya seperti char test;dalam deklarasi anggota untuk mendapatkan nilai default '\0'.
— Sergey Kalinichenko

14

Jika Objectreferensi telah dideklarasikan tetapi tidak dibuat instance-nya, nilainya adalah null.


8
Hanya sebagai bidang contoh kelas.
— Sotirios Delimanolis

1
@SotiriosDelimanolis bisakah Anda menjelaskannya? Saya mencoba untuk belajar :)
— SnakeDoc

5
@SnakeDoc Jika Anda mendeklarasikan sebuah Objek dalam tubuh metode, Anda akan mendapatkan kesalahan kompilasi jika Anda mencoba menggunakannya tanpa memulainya terlebih dahulu.
— Sotirios Delimanolis

9
Layak untuk tepat di sini - Anda tidak pernah mendeklarasikan suatu objek. Anda mendeklarasikan variabel . Mereka bukanlah hal yang sama.
— Jon Skeet

7
@SotiriosDelimanolis minta maaf untuk memunculkan diskusi yang sangat lama, tetapi apakah Anda kebetulan memiliki referensi mengapa mereka memutuskan itu harus menyebabkan kesalahan kompilasi, daripada hanya membuatnya menginisialisasi nullseperti bidang contoh?
— 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");
              }   
            }
        }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.