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?

SnakeDoc
sumber

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.

Sergey Kalinichenko
sumber
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.

Jared Nielsen
sumber
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");
              }   
            }
        }
Alexander Zaldostanov
sumber