2010-11-10 33 views
18

Bu koda sahibim:Başlatma ile başlatma arasındaki fark nedir?

MyClass object; 

.... some code here where object may or may not be initialised... 

if (object.getId > 0) { 
    .... 
} 

Hangi bir derleme hatasıyla sonuçlanır: object başlatılamadı, bu yeterince adil.

Şimdi kodumu şununla değiştirdim:

MyClass object; 

.... some conditional code here where object may or may not be initialised... 

if (object != null && object.getId > 0) { 
    .... 
} 

Aynı derleme hatasını alıyorum! Xzx37'yi sıfırlamak zorundayım:

MyClass object = null; 

Peki, bir nesneyi başlatmama ve null olarak sıfırlama arasındaki fark nedir? Başlatma olmadan bir nesneyi bildirirsem null değil mi?

Teşekkürler

cevap

27
  • alanlar (üye değişkenleri) null başlatılır
  • yerel değişkenler başlatıldı verilmez ve ilk belirlemekle yükümlüdür değer.
+0

bu benim sorum olsa da: "null" bir değer mi? Ben her zaman (belki de saf olarak) onu "değer değil" olarak kabul ettim, bu yüzden başlatılmaya eşdeğerdir. –

+1

Bunun farkında değildi. Şimdi ben de bugün yeni bir şey öğrendim :) – Nailuj

+5

@Richard: null kesinlikle bir değer. Herhangi bir nesneyi ifade etmeyen değerdir. "Kesinlikle atanmamış" ve "kesinlikle null değeriyle atanan" arasında bir fark var. –

3

Bir dil çözünürlüklü bir şey.

YÖNTEM-kapsam değişkenleri zorunluluk elle başlatılır dil devletler - Bunları NULL olarak başlatmak istiyorsanız, açıkça bunu söylemek gerekir - bunu yapmak için başarısız olursa, onlar temelde vardır tanımlanmamış hal. Aksine, dil, CLASS kapsamındaki değişkenlerin manuel olarak başlatılmasının gerekmediğini belirtir - bunları başlatma hatası otomatik olarak NULL olarak başlatılır - bu yüzden endişelenmeniz gerekmez.

İki durum arasındaki fark kadarıyla (null ve undefined), evet temelde aynıdır - ancak dil, bir değişkeni başlatmanız gerektiğini belirtir (sizin için otomatik olarak yapılmış olsun veya olmasın) değişkenin kapsamı).

+1

Yani, bu -> http: // goo.gl/Dhtebe sadece kısmen doğru mu? – Sotti

+1

@ Sotti, size sağladığınız referans özellikle CLASS kapsamındaki yöntemler hakkında konuşuyor ve kesinlikle doğru. Gönderiyi tekrar okuyorsunuz ve METHOD kapsamlı ve CLASS kapsamlı değişkenler arasında ayrım yaptığımı fark edeceksiniz. Referansınızın işaret ettiği gibi, Sınıflandırılmış değişkenler varsayılan değerlerle başlatılır; Ancak, Yöntem kapsamındaki değişkenler yoktur. Ek olarak, Java diline özel bir dikkat göstererek, "Yerel bir değişkene açıkça bir değer verilmelidir ..." - parçaya dikkat edin. http://docs.oracle.com/javase/specs/jls/se7/html/jls-4.html#jls-4.12.5 – Bane

+1

Harika, bana açık. Teşekkürler. – Sotti

0

nesnenin arasında Beyanınız çok yığın üzerinde MyClass örneğine bir işaretçisi beyanı veya referans vardır. İşaretçiyi başlatmazsanız, aslında rastgele bir yere işaret eden bir işaretçi alırsınız. İşaretçiyi NULL olarak başlatırken, derleyicinin geçersiz olduğunu bilen bir NULL adresine işaret edecek şekilde ayarlıyorsunuz. örtük sizin için NULL'A üye değişkenleri başlatırken çünkü

Ekstra karışıklık Java tanıtıldı.

Size C++ gibi düşük düzeyli diller kullandıysanız biraz daha mantıklı.

+0

İddialarınızın, bir java değişkeninin NULL olarak bir yere rastgele bir yere işaret etmedeki başarısızlığının doğru olduğunu düşünmüyorum. Ne aldığınızı anlıyorum, ancak bir değişkeni başlatmadan beyan edebileceğiniz ve böylece rastgele bir belleğe erişebildiğinizi varsaymanın doğru olduğunu düşünmüyorum. Alt düzey dillerin bu şekilde işlediğini anlıyorum, ancak bu mutlaka Java'nın aynı şekilde yaptığı anlamına gelmez. – Bane

+0

@Bane Yerel bir değişkenin atamadan önce hangi değere sahip olduğunu tartışmak için çok fazla vermeyecektir, çünkü bu değeri gözlemleyemezsiniz: Derleyici ve bytecode veri doğrulayıcısı, atamadan önce yerel bir değişkene erişmenize izin vermez. Bayt kodu doğrulayıcıyı devre dışı bırakmadıkça ve bu eylemi gerçekleştirmek için baytkod manipülasyonunu kullanmazsanız. –

+0

Bu benim amacımdı. ;) – Bane