Logo Hardware.com.br
Thyago Sic
Thyago Sic Membro Senior Registrado
359 Mensagens 6 Curtidas

[Resolvido] Dúvida sobre Java

#1 Por Thyago Sic 18/03/2012 - 12:55
Galera, tenho as seguintes classes em Java:


class Comida
{
private String nome;
public Comida(String s)
{ nome=s; }
public String getNome()
{return nome;}
}



class Sanduiche extends Comida
{ public Sanduiche(String s)
{ super(s); }
}



class Panela
{
public void fazer (Comida c)
{ System.out.println("Estou fazendo "+ c.getNome()); }
}



class Frigideira extends Panela
{

public void fazer (Sanduiche s)
{ System.out.println("Estou tostando "+ s.getNome()); }

public void fazer (Comida c)
{ System.out.println("Estou fritando "+ c.getNome()); }
}



E tenho uma outra classe para testar as anteriores


public class Teste
{
public static void main(String a[])
{
Panela p, q;
p = new Panela();
q = new Frigideira();

Comida c = new Comida("galinha"
Comida s = new Sanduiche("bauru"
p.fazer(c);
q.fazer(c);
q.fazer(s);
}
}



Enfim, a saída da classe de teste é:

Estou fazendo galinha
Estou fritando galinha
Estou fritando bauru

Mas o bauru não deveria ser tostado? Notem que q é uma frigideira, e eu estou invocando o método fazer passando um sanduíche como parâmetro. Na classe frigideira, o sanduíche deveria ser tostado.

Alguém pode me dar uma força nessa?

Abraço.
Thyago Sic
Thyago Sic Membro Senior Registrado
359 Mensagens 6 Curtidas
#3 Por Thyago Sic
18/03/2012 - 13:22
sephiroth0 disse:
Estou enferrujado no java, mas tenta declarar uma Frigideira:
[php]public class Teste { public static void main(String a[]) {
Panela p;
p = new Panela();
Frigideira q = new Frigideira();
Comida c = new Comida("galinha");
Comida s = new Sanduiche("bauru");
p.fazer(c);
q.fazer(c);
q.fazer(s);
} }[/php]


Vlw pela resposta sephiroth.

Declarando uma nova frigideira a saída continua a mesma.

Flw.
"Estou de joelhos vendo o céu desabar...."
sephiroth0
sephiroth0 Super Zumbi Registrado
6.9K Mensagens 694 Curtidas
#4 Por sephiroth0
18/03/2012 - 13:31
Thyago Sic disse:
Vlw pela resposta sephiroth.

Declarando uma nova frigideira a saída continua a mesma.

Flw.

Mesmo com um objeto do tipo Frigideira, como coloquei?
Frigideira q = new Frigideira();
Estranho, Com isso é para sobrescrever o método fazer da classe Panela.
Se estiver usando uma IDE, tenta limpar o projeto, veja se não se perdeu e está usando o arquivo compilado antigo.
Thyago Sic
Thyago Sic Membro Senior Registrado
359 Mensagens 6 Curtidas
#5 Por Thyago Sic
18/03/2012 - 13:37
sephiroth0 disse:
Mesmo com um objeto do tipo Frigideira, como coloquei?
Frigideira q = new Frigideira();
Estranho, Com isso é para sobrescrever o método fazer da classe Panela.
Se estiver usando uma IDE, tenta limpar o projeto, veja se não se perdeu e está usando o arquivo compilado antigo.


Sim, segue como está a classe de teste agora:


public class Teste
{
public static void main(String a[])
{
Panela p;
p = new Panela();


Frigideira q;
q = new Frigideira();

Comida c = new Comida("galinha"
Comida s = new Sanduiche("bauru"
p.fazer(c);
q.fazer(c);
q.fazer(s);
}
}


Vou tentar fazer um projeto novo aqui pra ver se a saída é diferente. Mas creio que não seja o caso, porque trata-se de um exercício da faculdade, acho que tem algo que o professor quer que descubramos aí.


Valeu pela ajuda.
"Estou de joelhos vendo o céu desabar...."
tpcvasco
tpcvasco General de Pijama Registrado
2.9K Mensagens 330 Curtidas
#6 Por tpcvasco
19/03/2012 - 10:11
Apesar de vc ter declarado o 's' como um new Sanduiche, o tipo dele, para todos os efeitos, é "Comida", a não ser q vc faça um cast, ou declare da forma
Sanduiche s = new Sanduiche("bauru");
"Milhouse: - Médicos e bombeiros são heróis.
Bart Simpson: - Olha, as casas continuam pegando fogo e as pessoas continuam doentes. Os verdadeiros heróis são os Schwarzenegger's, os Stallone's, e, em menores proporções, os Vandame's..."
Thyago Sic
Thyago Sic Membro Senior Registrado
359 Mensagens 6 Curtidas
#7 Por Thyago Sic
20/03/2012 - 08:02
tpcvasco disse:
Apesar de vc ter declarado o 's' como um new Sanduiche, o tipo dele, para todos os efeitos, é "Comida", a não ser q vc faça um cast, ou declare da forma
Sanduiche s = new Sanduiche("bauru");


Edit:

Enfim, óntem meu professor finalmente revelou a questão.

É exatamente isso que você comentou, para todos os efeitos Sanduiche é Comida, mas porque isso? Trata-se de algo chamado single dispatch, em que um objeto quando chamado em um método, é considerado como um objeto do tipo que foi declarado. Sanduiche foi declarado como Comida, portanto será tratado como comida em todo método que for chamada. É uma peculiaridade não só do Java, mas do C++ também.

Enfim, obrigado a todos pela força.

Abraço.
"Estou de joelhos vendo o céu desabar...."
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal