Er is een fout opgetreden bij het declareren van een object met dezelfde naam, maar er is geen fout als we objectgebruik een for-lus declareren

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

tijdens het uitvoeren, maakt deze code 3 DescriptionInfoDTO-object met 'description' als naam en voeg het toe aan een lijst. Deze code wordt correct uitgevoerd zonder een fout te tonen ...

Maar als we een object als hieronder declareren, dat wil zeggen zonder het te gebruiken voor lus, gebeurt er een fout, waarom?

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);

is beide code hetzelfde?

1
Omdat de eerste slechts eenmaal wordt gedeclareerd en meerdere keren opnieuw wordt toegewezen. Er is geen abiguïteit
toegevoegd de auteur Scary Wombat, de bron
Nee, het is niet hetzelfde. in voor block scope van het object is alleen voor dat blok.
toegevoegd de auteur Pratik, de bron

8 antwoord

Als u het tweede fragment wijzigt in

{
    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);
}

het zal equivalent zijn aan het eerste fragment en compilatie doorgeven.

2
toegevoegd

Het punt is hier: binnen de for-lus bestaat de variabele alleen binnen de grenzen (scope) van die lus en houdt op te bestaan ​​als de lus is voltooid.

Op deze manier bestaan ​​de variabelen nooit 'op hetzelfde moment'.

Dit maakt het mogelijk om het opnieuw te declareren, gewoon niet op hetzelfde moment, terwijl je het zonder code in de code probeert te doen.

2
toegevoegd

Het verschil tussen de eerste en de tweede is dat je eerst een lus uitvoert, en dat de lus alle variabelen die je maakt de vernietigde voltooiing van de lus is, dus wanneer je naar de volgende iteratie gaat, kun je een nieuwe variabele maken

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

maar in het tweede geval maakt u een nieuwe variabele, terwijl een andere variabele al in hetzelfde bereik bestaat. wat niet mogelijk is

1
toegevoegd

Variabelen zijn scoped (zie JLS §6.3 voor meer informatie).

Het lichaam van de lus verklaart zijn eigen bereik, dus de twee codefragmenten zijn niet equivalent. Dat zou zo zijn, als je ook deze lijnen laat scoped:

{
    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
toegevoegd

In het eerste geval declareert u de objecten in scope van één lus-iteratie. Na één iteratie bestaat het object niet meer.

In the second case you define three objects in the same scope. Wich results in a compile time error.

0
toegevoegd

krijgen een foutmelding voor meerdere declaraties omdat u meerdere variabelen met dezelfde naam declareert .

Als u een variabele binnen een lus declareert, is deze alleen binnen het bereik van die lus , wat betekent dat zodra de huidige iteratie is voltooid, deze wordt gewist.

0
toegevoegd

Het werkelijke verschil tussen de twee voorbeelden is de scope waarin de variabele bestaat:

  • in het eerste voorbeeld is de reikwijdte van de variabele een enkele iteratie van de lus - een nieuwe scoop wordt gemaakt voor elke iteratie en alles dat binnen de accolades wordt gedeclareerd, is lokaal voor die scope (tenzij het buiten de accolades wordt gedeclareerd, zoals is de i variabele)
  • in het tweede voorbeeld bestaan ​​alle drie variabelen in één bereik en is slechts één variabele voor een naam toegestaan ​​in een bereik
0
toegevoegd

De levensduur van het object in de for-lus eindigt na die iteratie, maar als u het afzonderlijk declareert, zoals de code die u hebt weergegeven in plaats van voor lus. Het kan niet meerdere variabelen met dezelfde naam op stapel plaatsen, waardoor u de foutmelding krijgt.

0
toegevoegd