Aynı ada sahip nesneyi bildirirken hata oluştu, ancak nesnesinin bir for döngüsü kullandığını bildirirsek hata olmaz

for(i=0; i< 3; i++){
            DescriptionInfoDTO description = new DescriptionInfoDTO();
            description.setLanguage("English");
            description.setName("anu");
            description.setState("Kerala");
            descriptionInfoList.add(description);
}

yürütülürken, bu kod ile 3 DescriptionInfoDTO nesnesi oluşturun. ad olarak 'açıklama' ve bir listeye ekleyin. Bu kod herhangi bir hata göstermeden doğru şekilde çalışıyor ...

Fakat aşağıdaki gibi bir nesneyi açıklarsak, yani döngü için kullanmadan, hata olur, neden?

DescriptionInfoDTO description = new DescriptionInfoDTO();
            description.setLanguage("English");
            description.setName("anu");
            description.setState("Kerala");
            descriptionInfoList.add(description);

DescriptionInfoDTO description = new DescriptionInfoDTO();
            description.setLanguage("English");
            description.setName("anu");
            description.setState("Kerala");
            descriptionInfoList.add(description);

DescriptionInfoDTO description = new DescriptionInfoDTO();
            description.setLanguage("English");
            description.setName("anu");
            description.setState("Kerala");
            descriptionInfoList.add(description);

Her iki kod da aynı şeyi yapıyor mu?

1
Çünkü ilki sadece bir kez ilan edildi ve birçok kez tekrar atandı. Belirsizlik yok
katma yazar Scary Wombat, kaynak
Hayır aynı şey değil. nesnenin blok kapsamı için bu blok içindir.
katma yazar Pratik, kaynak

8 cevap

İkinci pasajı değiştirirseniz,

{
    DescriptionInfoDTO description = new DescriptionInfoDTO();
            description.setLanguage("English");
            description.setName("anu");
            description.setState("Kerala");
            descriptionInfoList.add(description);
}

{
    DescriptionInfoDTO description = new DescriptionInfoDTO();
            description.setLanguage("English");
            description.setName("anu");
            description.setState("Kerala");
            descriptionInfoList.add(description);
}

{
    DescriptionInfoDTO description = new DescriptionInfoDTO();
            description.setLanguage("English");
            description.setName("anu");
            description.setState("Kerala");
            descriptionInfoList.add(description);
}

ilk snippet'e eşdeğer olacak ve derlemeyi geçecek.

2
katma

Buradaki nokta şudur: for döngüsü içinde, değişken yalnızca o döngünün sınırları (kapsamı) içinde bulunur ve döngü bittiğinde var olmaktan çıkar.

Bu şekilde, değişkenler asla 'aynı anda' mevcut değildir.

Bu, döngü olmadan kodda yapmaya çalıştığınız gibi, aynı anda değil, yeniden bildirmeyi mümkün kılar.

2
katma

Birinci ve ikinci arasındaki fark, ilk önce bir döngü çalıştırıyor olmanız, i yarattığınız tüm değişken i, döngünün tamamlanmasının imha edilmesidir, bu nedenle bir sonraki yinelemeye giderken yeni bir değişken oluşturabilirsiniz.

for(i=0; i< 3; i++){
            DescriptionInfoDTO description = new DescriptionInfoDTO();
            description.setLanguage("English");
            description.setName("anu");
            description.setState("Kerala");
            descriptionInfoList.add(description);
} //description is destroyed here

ancak ikinci durumda, yeni bir değişken oluştururken, aynı kapsamda başka bir değişken daha var. mümkün değil

1
katma

Değişkenler kapsamlıdır (bkz. JLS §6.3 ).

Döngü gövdesi kendi kapsamını bildirir, bu nedenle iki kod parçacığı değil eşdeğerdir. Ayrıca, bu satırları da kapsamazsanız:

{
    DescriptionInfoDTO description = new DescriptionInfoDTO();
    description.setLanguage("English");
    description.setName("anu");
    description.setState("Kerala");
    descriptionInfoList.add(description);
}

{
    DescriptionInfoDTO description = new DescriptionInfoDTO();
    description.setLanguage("English");
    description.setName("anu");
    description.setState("Kerala");
    descriptionInfoList.add(description);
}

{
    DescriptionInfoDTO description = new DescriptionInfoDTO();
    description.setLanguage("English");
    description.setName("anu");
    description.setState("Kerala");
    descriptionInfoList.add(description);
}
0
katma

İlk durumda, nesneleri bir döngü yinelemesi kapsamında bildirirsiniz. Bir yinelemeden sonra nesne artık mevcut değil.

İkinci durumda, aynı kapsamda üç nesne tanımlarsınız. Wich derleme zamanı hatası ile sonuçlanır.

0
katma

birden fazla bildirimde hata alıyorsunuz çünkü aynı adda birden fazla değişken bildirdiniz .

Bir döngü içindeki bir değişkeni bildirirseniz, o zaman yalnızca geçerli yineleme biter bitmez temizlenecek, yani o döngü kapsamı dahilinde erişilebilir.

0
katma

İki örnek arasındaki gerçek fark, değişkenin var olduğu kapsamıdır :

  • ilk örnekte değişkenin kapsamı, döngünün tek bir yinelemesidir - her yineleme için yeni bir kapsam oluşturulur ve küme parantezi içinde bildirilen her şey bu kapsam için yereldir (parantezlerin dışında belirtilmediği sürece i değişkeni)
  • ikinci örnekte tüm üç değişken bir kapsamda bulunur ve bir ad için yalnızca bir değişkene kapsamda izin verilir
0
katma

For döngüsündeki nesnenin ömrü bu yinelemeden sonra sona erer, ancak bunu döngü için gösterdiğiniz kod gibi ayrı olarak ilan ederseniz. Yığın üzerine aynı ada sahip birden fazla değişken koyamaz ve bu nedenle hatayı alıyorsunuzdur.

0
katma