Dúvida de infância - atributos que passam por objetos que não têm onde guardá-los

4 respostas
G

cara… isso nao faz sentido… Deixa eu tentar explicar…

Vc tem uma classe A…
vc cria uma outra classe B, que vc definiu que ela extende de A, significa que B pode ser A… mas nao quer dizer que A é B… alias, dizer que B pode ser é esta errado, pq A não implementa nada de B

Bom, pelo menos foi isso que entendi da sua pergunta…

4 Respostas

T

É isso mesmo.

Não, não perde, porque a instância de B não perde sua identidade só porque há uma variável do tipo A apontando para ele.
Não se esqueça que apenas as referências são guardadas, já que Java, ao fazer uma atribuição, copia a referência e não o valor. (Tanto é que existe um método específico, chamado “clone”, que é pensado para poder fazer cópias de objetos.)

Não analisei seu código (tenho preguiça de ler código, prefiro copiar para um arquivo e tentar compilá-lo e executá-lo). Mas, como disse acima, não é porque você guardou uma referência de um objeto da classe B em uma variável do tipo A que ele automaticamente é “podado” para ser um objeto da classe “A”.

gomesrod

Um exemplo muito besta que acabei de inventar:

class Pessoa {
	String nome;
	Date dataNascimento;
	{ .....outros ....}
}

class Programador extends Pessoa {
	String linguagemProgramacao;
	Projeto projetoAtual;

	public void escreverCodigo() {...}
}

// Na empresa, joao é referenciado como tipo Programador
// Podemos chamar todos os seus métodos
Programador joao = new Programador();
if (joao.linguagemProgramacao.equals("java")) {
	joao.projetoAtual = new ProjetoJava();
	joao.escreverCodigo();
}

// Na hora do almoço, joao vai ao banco onde é referenciado apenas
// como o tipo mais genérico pessoa
Pessoa joaoPessoa = joao;

// A referencia só permite chamar os métodos da classe Pessoa
// (que é o que interessa nesse contexto) mas o objeto em si
// não foi alterado, apenas a referencia.
banco.preencherPapelada(joaoPessoa.nome, joaoPessoa.dataNascimento, etc)
joaoP.escreverCodigo() // Esta linha não compila!

// Após o almoço João volta ao trabalho.
Programador joaoAfterLunch = (Programador) joaoPessoa;

// O objeto em si não sofreu nenhuma alteração por ter sido referenciado
// de maneiras diferentes. Ou seja, João não deixou de ser um programador
// apenas porque em determinado momento foi chamado de "Pessoa" apenas.
// Tudo continua como era antes
while (not isExpedienteTerminado()) {
	joaoAfterLunch.escreverCodigo();
}
Luiz_Rocha

Essa é bem fácil, é uma dúvida que eu tenho desde criança:

Digamos que eu crie uma classe A, com os atributos a1 e a2. Aí eu crio a classe B, que extends A e tem os atributos b1 e b2. Assim a classe B na verdade tem os atributos a1, a2, b1 e b2, certo?

Se eu armazenar uma instância de B num objeto da classe A eu vou perder os valores dos atributos b1 e b2? Isto é, se eu fizer:

B objb = new B(valorParaA1,valorParaA2,valorParaB1,valorParaB2);

A obja = objb;

B objb2= ( (B) obja );

if( objb2.b1 == null && objb2 == null) { this.fazAlgumaCoisa(); }

O método fazAlgumaCoisa será chamado ou não? Caso os valores atributos b1 e b2 de objb2 seja iguais aos ve objb, como isso acontece?Sim, porque eles tiveram de "passar" por um objeto cuja classe não tem onde guardá-los. Onde eles ficam armazenados?

Agradeço qualquer tentativa.
( Se eu estiver ficando é doido, me avisem! :) )

Luiz_Rocha

Valeu mesmo, galera. Agora eu entendo. Já tenho o que explicar aos meus filhos quando eles me perguntarem.

Criado 24 de setembro de 2007
Ultima resposta 25 de set. de 2007
Respostas 4
Participantes 4