Bu kodun neden aşağıdaki çıktıda neden kaynaklandığını açıklayan var mı?Boole referansları boş
true
false
Bu kodun neden aşağıdaki çıktıda neden kaynaklandığını açıklayan var mı?Boole referansları boş
true
false
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.
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. –
@SotiriosDelimanolis açıklama için yeniden yorumladı – Cruncher
@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
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.
... 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);
}
}
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.
+1 Bunu beğendim. Atla bazı sözdizimsel şekerden geçti ve cevabımdaki örnekten farklı olmadığını gösteriyor. – Cruncher
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.
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
.
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.
Son olarak, a
ve bunlara b
noktası olsun. Eğer bu yola baktığımızda
a = new Boolean(true);
b = new Boolean(false);
, ben
a
ve
b
değişen dizi üzerinde bir etkisi yoktur niçin daha açık olduğunu düşünüyorum.
Güzel illüstrasyon.Eğitim veya öğretime girebilirsin :) –
Şimdi hile sorusu, Java yokken değişkenleri nasıl atayabiliyorsunuz? Not: @ Test notuna dikkat edin. –
Açıklama için ayrılmayı bıraktım - orada görülecek hiçbir şey yok! – StuPointerException
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 :) –