Pergunta simples

15 respostas
A
import java.util.ArrayList;

class Pessoa {
	private String name;

	public Pessoa(String name) {
		this.name = name;
	}

}

public class Teste1 {
	public static void main(String args[]) {
		ArrayList<Pessoa> listaPessoas = new ArrayList<Pessoa>();
		Pessoa p = new Pessoa("Joao");
		listaPessoas.add(p);
		Pessoa p = new Pessoa("Maria");
		listaPessoas.add(p);

	}
}

porque que assim(acima) o programa compila…

import java.util.ArrayList;

class Pessoa {
	private String name;

	public Pessoa(String name) {
		this.name = name;
	}

}

public class Teste1 {
	public static void main(String args[]) {
		ArrayList<Pessoa> listaPessoas = new ArrayList<Pessoa>();
		Pessoa p = new Pessoa("Joao");
	//	listaPessoas.add(p);
		Pessoa p = new Pessoa("Maria");
	//	listaPessoas.add(p);

	}
}

e assim nao compila?
pq o fato de eu adicionar os objetos na ArrayList muda a forma como eles são criados? queria uma explicação que me ajudasse a entender melhor como java funciona
valeu!

15 Respostas

Fernando_Generoso_da

Nenhum dos dois códigos compila, isso porque tu declara duas vezes objetos pessoa, com uma mesma variável:

Pessoa p = new Pessoa("Joao");  
        listaPessoas.add(p);  
        Pessoa p = new Pessoa("Maria");
luxu

kra naum responderei sua pergunta pois tb naum sei, mas estou estudando aos poucos para tirar a SCJP e te falo um negócio, é complicado viu, como tem “pqs” em java…só!

R

Você criou 2 objetos com o mesmo nome e está tentando inseri-los no arraylist.

Funcionará caso você mude o nome do objeto:

Pessoa p = new Pessoa("Joao"); listaPessoas.add(p); Pessoa p1 = new Pessoa("Maria"); listaPessoas.add(p1);

Hildebrando_Pedroni

Alguma coisa está errada no exemplo que vc mandou, porque nem a de cima e nem a de baixo irão compilar:
Ambos vão lançar o erro

p is already defined in main

A não ser que vc tenha mandado algum código diferente do que vc tem na sua maquina, isso não compila, pois como já foi dito, vc não pode declarar duas váriaveis
iguais no mesmo escopo.

No caso isso compilaria sem problemas

Pessoa p = new Pessoa("João");
listaPessoas.add(p);
p = new Pessoa("Maria");
listaPessoas.add(p);

só que neste caso vc perderia a referência ao objeto criado anteriormente que vou chamar de Pessoa(“joão”);
e ele não poderia mais ser acessado e estaria elegível ao gc.

Veja se vc não mandou os códigos errados.

abraços

Campanate

É mas no caso , ele não instancio de novo o objeto, ele realmente criou outro objeto, assim o compilador irá mostra uma mensagem de objeto duplicado

A

ué que estranho, realmente nao esta compilando nenhum dos dois

olhem este código de um programa q eu fiz

ESTE AQUI ESTA COMPILANDO, PODEM TESTAR

import java.util.ArrayList;
import javax.swing.*;
import java.util.Scanner;

class Pessoa{
	private String name;
	private int idade;
	private String cidade;

	public Pessoa(String name, int idade, String cidade) {
		this.name = name;
		this.idade = idade;
		this.cidade = cidade;
	}

	//METODOS GETTERS
	public String getName() {
		return this.name;
	}
	public int getAge() {
		return this.idade;
	}
	public String getCity() {
		return this.cidade;
	}
}

public class Info {
	public static void main(String args[]) {
		int n = Integer.parseInt(JOptionPane.showInputDialog("Deseja adicionar informacoes de quantas pessoas? "));
		int x;
		String sn = new String("SIM");
		ArrayList<Pessoa> listaInfo = new ArrayList<Pessoa>();
		do {
			for (x=0; x<n; x++) { //COMECA AQUI
				String name = JOptionPane.showInputDialog("Digite o nome da "+(x+1)+"ªpessoa: ");
				int idade = Integer.parseInt(JOptionPane.showInputDialog("Digite a idade: "));
				String cidade = JOptionPane.showInputDialog("Digite a cidade: ");
				Pessoa p = new Pessoa(name, idade, cidade); //ESTE LOOP ESTA FAZENDO A MESMO COISA QUE O PROGRAMA SIMPLES QUE EU POSTEI, CORRETO?
				listaInfo.add(p);
			} //FIM DO LOOP
			sn = JOptionPane.showInputDialog("Deseja ADICIONAR informações de mais pessoas?");
			sn.toUpperCase();
			if (sn.equalsIgnoreCase("SIM")) {
				n = Integer.parseInt(JOptionPane.showInputDialog("Deseja adicionar informacoes de quantas pessoas? "));
			}
		} while (sn.equalsIgnoreCase("SIM"));
		JOptionPane.showMessageDialog(null,
    								 "Informações armazenadas com sucesso!",
    								 "Parabéns",
    								 JOptionPane.PLAIN_MESSAGE);
    	sn = JOptionPane.showInputDialog("Deseja OBTER informações de alguma pessoa?");
    	int arraysize=0;
    	int y=0;
    	if (sn.equalsIgnoreCase("SIM")) {
  			arraysize = listaInfo.size();
			int z=1;
			for (Pessoa p : listaInfo) {
				JOptionPane.showMessageDialog(null,
    							 		z+" - Nome: "+((Pessoa)listaInfo.get(y)).getName()+", Idade: "+((Pessoa)listaInfo.get(y)).getAge()+", Cidade: "+((Pessoa)listaInfo.get(y)).getCity(),
    							 		"MEMORIZE",
    							 		JOptionPane.PLAIN_MESSAGE);
    			z++;
    			y++;
			}
		}
		JOptionPane.showMessageDialog(null,
    							 	"Programa executado com sucesso!",
    							 	"FIM",
    							 	JOptionPane.PLAIN_MESSAGE);
	}
}

esse loop q eu comentei esta fazendo a mesma coisa, não? ele esta criando novos objetos Pessoa p e adicionando na ArrayList!
qual a diferença dos dois?

R

Consegui compilar o primeiro código, separando as classes e colocando o import na classe Teste1

A

cola o codigo ai amigo!
:smiley:

Hebert_Coelho

O fato de vc adicionar a Pessoa em uma lista não influencia em nada a criação de outra Pessoa.

O problema do seu código é que vc está criando duas Pessoas com a referencia de nome p.

Coloque assim:

Pessoa pessoaHomem = new Pessoa("João"); Pessoa pessoaMulher = new Pessoa("Mulher");

Você vai ver que não terá problema. A lista é um grupo de objetos, ela não tem influência sobre o comportamento de quem está dentro dela.

A

jakefrog:
O fato de vc adicionar a Pessoa em uma lista não influencia em nada a criação de outra Pessoa.

O problema do seu código é que vc está criando duas Pessoas com a referencia de nome p.

Coloque assim:

Pessoa pessoaHomem = new Pessoa("João"); Pessoa pessoaMulher = new Pessoa("Mulher");

Você vai ver que não terá problema. A lista é um grupo de objetos, ela não tem influência sobre o comportamento de quem está dentro dela.

entao pq o ultimo codigo que postei acima funciona perfeitamente?

Hildebrando_Pedroni

Agora sim.

Na verdade o que acontece não é a mesma coisa

Você está criando a variável dentro de um loop, o que é diferente de criar duas variaveis iguais dentro do mesmo escopo:

Quando vc faz isso por exemplo

while(true){
  Pessoa p = new Pessoa(name, idade, cidade);
  listaInfo.add(p); 

}
Em cada loop vc apenas redeclara a variavel p e atribui a ela um novo objeto pessoa, e ai adiciona na lista. (isso tudo acontece dentro do escopo do loop, não há duplicação)

Assim funciona, porem vc pode acabar tendo um estouro de pilha, pois vc está enchendo sua memória de lixo (objetos sem referência). O GC Pode passar e limpar, mas como vc não sabe quando isso vai acontecer, pode ser que ele não passe a tempo de impedir o estouro.

Abraços

Hebert_Coelho

Olha a diferença:

for(...){... Pessoa p = new Pessoa(name, idade, cidade); //ESTE LOOP ESTA FAZENDO A MESMO COISA QUE O PROGRAMA SIMPLES QUE EU POSTEI, CORRETO? listaInfo.add(p); ...} para

ArrayList<Pessoa> listaPessoas = new ArrayList<Pessoa>(); Pessoa p = new Pessoa("Joao"); // listaPessoas.add(p); Pessoa p = new Pessoa("Maria");

No primeiro código a cada volta do seu loop, vc está utilizando a mesma referência “p”. E não declara uma nova.
No segundo, vc está querendo declarar dois “p”.

Fui claro?

A

Olha a diferença:

for(...){... Pessoa p = new Pessoa(name, idade, cidade); //ESTE LOOP ESTA FAZENDO A MESMO COISA QUE O PROGRAMA SIMPLES QUE EU POSTEI, CORRETO? listaInfo.add(p); ...} para

ArrayList<Pessoa> listaPessoas = new ArrayList<Pessoa>(); Pessoa p = new Pessoa("Joao"); // listaPessoas.add(p); Pessoa p = new Pessoa("Maria");

No primeiro código a cada volta do seu loop, vc está utilizando a mesma referência “p”. E não declara uma nova.
No segundo, vc está querendo declarar dois “p”.

Fui claro?

acho que meus conceitos em OO ainda estão bem fracos :frowning:

Fernando_Generoso_da

Olha esses dois código:

public class TesteEscopos {

	public static void main(String args[]){
		String v = new String("Escopo Principal");
		for (int i = 0; i < 6; i++) {
			String v = new String("Escopo interno");
		}
		
	}	
}
public class TesteEscopos {

	public static void main(String args[]){
		
		for (int i = 0; i < 6; i++) {
			String v = new String("Escopo interno");
		}
		String v = new String("Escopo Principal");
	}	
}

Tu vai ver que o primeiro código, não compila. Isso porque no primeiro trecho, eu declaro uma variável em um escopo "principal", e internamente dentro do for, declaro novamente uma variável com o mesmo nome. Isso quer dizer que o escopo "secundário", dentro do for, enxerga todas as variáveis do escopo onde o loop está inserido, nesse caso, no método main.

Agora no segundo trecho, o código compila. Isso porque todas as variáveis criadas no escopo do loop, são finalizadas junto com o loop. Assim, após esse trecho de código, é possível criar variáveis com os mesmos nomes que foram criado dentro do escopo do loop.

Não sei se consegui me fazer entender…Qualquer dúvida, posta aí…

Fernando

A

Fernando Generoso da Rosa:
Olha esses dois código:

public class TesteEscopos {

	public static void main(String args[]){
		String v = new String("Escopo Principal");
		for (int i = 0; i < 6; i++) {
			String v = new String("Escopo interno");
		}
		
	}	
}
public class TesteEscopos {

	public static void main(String args[]){
		
		for (int i = 0; i < 6; i++) {
			String v = new String("Escopo interno");
		}
		String v = new String("Escopo Principal");
	}	
}

Tu vai ver que o primeiro código, não compila. Isso porque no primeiro trecho, eu declaro uma variável em um escopo "principal", e internamente dentro do for, declaro novamente uma variável com o mesmo nome. Isso quer dizer que o escopo "secundário", dentro do for, enxerga todas as variáveis do escopo onde o loop está inserido, nesse caso, no método main.

Agora no segundo trecho, o código compila. Isso porque todas as variáveis criadas no escopo do loop, são finalizadas junto com o loop. Assim, após esse trecho de código, é possível criar variáveis com os mesmos nomes que foram criado dentro do escopo do loop.

Não sei se consegui me fazer entender…Qualquer dúvida, posta aí…

Fernando

valeu velho, era essa a explicação que eu estava procurando!

Criado 4 de setembro de 2010
Ultima resposta 7 de set. de 2010
Respostas 15
Participantes 7