Erro ao declarar objeto com o mesmo nome, mas nenhum erro se declararmos objeto usar um loop for

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

durante a execução, este código cria 3 objetos DescriptionInfoDTO com 'description' como nome e adicioná-lo a uma lista. Este código é executado corretamente sem mostrar nenhum erro ...

Mas se declararmos o objeto como abaixo, ou seja, sem usar loop for, o erro acontece, por quê?

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

tanto o código faz a mesma coisa?

1
Porque o primeiro só é declarado uma vez e reatribuído várias vezes. Não há abigância
adicionado o autor Scary Wombat, fonte
Não é a mesma coisa. in para escopo de bloco do objeto é somente para esse bloco.
adicionado o autor Pratik, fonte

8 Respostas

Se você alterar o segundo trecho para

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

será equivalente ao primeiro trecho e passará pela compilação.

2
adicionado

O ponto aqui é: dentro do loop for, a variável existe somente dentro dos limites (escopo) desse loop, e deixa de existir quando o loop termina.

Desta forma, as variáveis ​​nunca existem "ao mesmo tempo".

Isso torna possível declará-lo novamente, mas não ao mesmo tempo, quando você tenta fazer isso no código sem o loop.

2
adicionado

A diferença entre o primeiro e o segundo é que no primeiro você está executando um loop, i o loop todas as variáveis ​​que você criou são destruídas completando o loop, então quando você vai para a próxima iteração você pode criar uma nova variável

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

mas no segundo caso você cria uma nova variável, enquanto outra variável já existe no mesmo escopo. o que não é possível

1
adicionado

As variáveis ​​são escopo (consulte JLS §6.3 para mais informações).

O corpo do loop declara seu próprio escopo, então os dois trechos de código não são equivalentes. Eles seriam, se você também fizer essas linhas no escopo:

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

No primeiro caso, você declara os objetos no escopo de uma iteração de loop. Após uma iteração, o objeto não existe mais.

No segundo caso, você define três objetos no mesmo escopo. O que resulta em um erro de tempo de compilação.

0
adicionado

está recebendo um erro para várias declarações porque você está declarando várias variáveis ​​com o mesmo nome .

Se você declarar uma variável dentro de um loop, então ela só estará acessível dentro do escopo desse loop , o que significa que assim que a iteração atual terminar, ela será apagada.

0
adicionado

A diferença real entre os dois exemplos é o escopo no qual a variável existe:

  • no primeiro exemplo, o escopo da variável é uma única iteração do loop - um novo escopo é criado para cada iteração e tudo declarado dentro das chaves é local para esse escopo (a menos que seja declarado fora das chaves, como é a variável i )
  • no segundo exemplo, todas as três variáveis ​​existem em um escopo e apenas uma variável para um nome é permitida em um escopo
0
adicionado

O tempo de vida do objeto no loop for terminará após essa iteração, mas se você o declarar separadamente, como o código mostrado em vez de loop for. Não é possível colocar várias variáveis ​​com o mesmo nome na pilha, porque você está recebendo o erro.

0
adicionado