Başlatılmamış Nesne ve NULL Olarak Başlatılmış Nesne


93

Java'da çalışıyorum.

Genelde bazı nesneleri şu şekilde kurarım:

public class Foo {
    private SomeObject someName;

    // do stuff

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

Soru şu: someNameBu örnekte null, reliably for all objectssıfır kontrolünün başlatılmamış nesnelerin doğru olacağını varsayabildiğim gibi, eşit mi?

Yanıtlar:


115

Doğru, hem statik hem de açıkça başlatılmamış başvuru türünün örnek üyeleri nullJava tarafından ayarlanır . Aynı kural dizi üyeleri için de geçerlidir.

Gönderen Java Dil Şartname , bölüm 4.12.5:

Değişkenlerin İlk Değerleri

Bir programdaki her değişken, değeri kullanılmadan önce bir değere sahip olmalıdır:

Her sınıf değişkeni, örnek değişkeni veya dizi bileşeni, oluşturulduğunda varsayılan bir değerle başlatılır

[...] Tüm başvuru türleri için varsayılan değer şeklindedir null.

Yukarıdaki kuralın yerel değişkenleri hariç tuttuğuna dikkat edin: bunlar açıkça başlatılmalıdır, aksi takdirde program derlemez.


örneğin bu nasıl geçerlidir char? Yapabilirim char test;ama yapamamchar test = null;
xorinzor

1
@xorinzor Sen atanamıyor nulliçin charilkel bir tür olduğu için. Ayrıca daha sonra char test;atama yapmadan bir yöntemin içinde yapamazsınız test. Varsayılan değerini almak için char test='a'isterseniz yapabilir veya char test;üye bildirimindeki gibi bırakabilirsiniz '\0'.
Sergey Kalinichenko

14

Bir Objectreferans bildirilmiş ancak somutlaştırılmamışsa, değeri olur null.


8
Yalnızca bir sınıfın örnek alanı olarak.
Sotirios Delimanolis

1
@SotiriosDelimanolis detaylandırır mısınız lütfen? Öğrenmeye çalışıyorum :)
SnakeDoc

5
@SnakeDoc Bir yöntem gövdesinde bir Object bildirirseniz, onu önce başlatmadan kullanmaya çalışırsanız bir derleme hatası alırsınız.
Sotirios Delimanolis

9
Burada kesin olmaya değer - asla bir nesne beyan etmiyorsunuz. Bir değişken tanımlıyorsunuz . Aynı şey değiller.
Jon Skeet

7
@SotiriosDelimanolis gerçekten eski bir tartışmayı gündeme getirdiğim için üzgünüm, ancak bir örnek alanını beğenmek için başlatmak yerine neden bir derleme hatasına neden olması gerektiğine karar verdiklerine dair bir referansınız var nullmı?
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");
              }   
            }
        }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.