2013-10-15 26 views
13

Bu kodun neden aşağıdaki çıktıda neden kaynaklandığını açıklayan var mı?Boole referansları boş

true 
false 
+3

Şimdi hile sorusu, Java yokken değişkenleri nasıl atayabiliyorsunuz? Not: @ Test notuna dikkat edin. –

+3

Açıklama için ayrılmayı bıraktım - orada görülecek hiçbir şey yok! – StuPointerException

+1

Ah utanç. Test ortamının neden olduğu bazı "sihir" olduğunu düşündüm. Açıkçası durumda değil ama yabancı şeyler gördüm :) –

cevap

21
a = new Boolean(true); 
b = new Boolean(false); 

Bu değişmez:

@Test 
public void testBooleanArray() { 
    Boolean[] ab = new Boolean[]{a, b}; 

    a = new Boolean(true); 
    b = new Boolean(false); 

    for(Boolean x : ab) { 
     System.out.println(x); 
    } 
} 

Sonuç:

null 
null 

ab değil işaretçileri tutan dizisi ve nesne b ve bu nedenle çıkış itiraz etmelidir a ve b'nin işaret ettiği nesneler (dizideki öğeler). Onları new nesnesine işaret eder. Bu dizi modfying değildir

göstermek için:

Boolean a = new Boolean(true); 
Boolean b = new Boolean(false); 
Boolean c = a; 
Boolean d = b; 
a = new Boolean(false); 
b = new Boolean(true); 

c ve d'nin Sırasıyla doğru/yanlış olacaktır. Bu, dizi referansınız aynı şekilde adlandırılmadığı sürece, dizi ile aynı şeydir.

+3

Buzz öldürmek/doğru ifadeler zamanı. Yukarıdaki kod, "a" ve "b" nin işaret ettiği nesneyi değiştirir. Bununla birlikte, dizi elemanının "a" ve "b" ('null') 'dan kopyalanan referansları işaret ettiği nesneleri değiştirmez. –

+0

@SotiriosDelimanolis açıklama için yeniden yorumladı – Cruncher

+3

@SotiriosDelimanolis Bunu biraz düşündüm ve gerçekten sadece dilsel belirsizlik (daha iyi açıklanmadı). Eğer a.change() 'i kullanırsam, şöyle diyebilirim:“ Nesneyi değiştirdiğim bir nokta var. Eğer a = new Object(); 'ise, şunu söyleyebilirim:' Nesneyi değiştirdiğim bir nokta var. Sadece referans hakkında, diğeri ise nesne hakkında konuşuyor. – Cruncher

8

Boole'lerinizi atamadan önce başlatmanız gerekir.

Boolean[] ab = new Boolean[]{a, b}; 

a = new Boolean(true); 
b = new Boolean(false); 

Bu Nesneler ile öncedir

a = new Boolean(true); 
b = new Boolean(false); 

Boolean[] ab = new Boolean[]{a, b}; 

için, nesnenin referansını kopyalamak ve yeni deyimi ile, sen atarken birinci b sıfırdı yeni bir nesne oluşturmak.

3

... Bu kesinlikle normaldir. Değerleri başlatıyorsunuz, ancak sıralı olarak, a ve b hala, işlemin değişkenleri atamaya geçmesinden önce null'dur. Yerleştirilen değişkenler değil, bir dizideki öğeler olarak değerleri veya referansları değil. unrolled

@Test 
public void testBooleanArray() { 
    /* We have a Boolean array, Boolean being able to hold a true, false but 
    also a null as an object */ 
    Boolean[] ab = new Boolean[]{a, b}; /* We initialize the array with the variables 
    here but ... */ 

    a = new Boolean(true); // ... the instances are only set at this stage 
    b = new Boolean(false); /* Plus, even if Boolean is immutable, the use of new 
    will actually create new objects */ 

    for(Boolean x : ab) { 
     System.out.println(x); 
    } 
} 
6

Kodunuz:

Boolean a = null; 
Boolean b = null; 
Boolean[] ab = new Boolean[2]; 
ab[0] = a; 
ab[1] = b; 

a = new Boolean(true); 
b = new Boolean(false); 

an değişkenlerin içeriği adlandırılmış b dizisine kopyalanan , o boş olarak ayarlandı. ve kopyalarına göre kopyasının referansına göre önemli bir fark vardır.

Bir yan not olarak: gereksiz nesne oluşturulmasını önlemek için Boolean.TRUE veya en azından Boolean.valueOf (true) kullanılması önerilir. Boolean değeri için pek çok seçenek yoktur ve Boolean değişmez'dir.

+0

+1 Bunu beğendim. Atla bazı sözdizimsel şekerden geçti ve cevabımdaki örnekten farklı olmadığını gösteriyor. – Cruncher

4

Dizi öğelerini işaretçi olarak görselleştirmenin yararlı olduğunu düşünüyorum.

Her ikisi de null işaret eden iki işaretçi, a ve b oluşturuyoruz.

Pointers a and b point to null

Boolean a = null, b = null; 

Sonra, iki işaretçileri, ab[0] ve ab[1] oluşturmak ve a ve b aynı yerde onları noktası. Yani null.

All four pointers point to null

Boolean[] ab = new Boolean[]{a, b}; 

Sonra, (tabloların new Boolean(true) ve new Boolean(false) parçalarla) yeni Boole true ve false nesneler yaratmak.

Two new Booleans have been created

Son olarak, a ve bunlara b noktası olsun. Eğer bu yola baktığımızda

a = new Boolean(true); 
b = new Boolean(false); 

a and b point to the new Booleans

, ben a ve b değişen dizi üzerinde bir etkisi yoktur niçin daha açık olduğunu düşünüyorum.

+0

Güzel illüstrasyon.Eğitim veya öğretime girebilirsin :) –