Construtor da SuperClasse chamando método sobreescrito da Subclasse??  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
Daniel.F
GUJ Ranger

Membro desde: 29/03/2007 18:30:39
Mensagens: 909
Offline

Boa Tarde, pessoaLL.

O seguinte codigo imprime 40 para tal eu cheguei a conclusão que o construtor da superclasse está chamando um metodo sobrecarregando na subclasse.

Agradeço qualquer explicação.

This message was edited 2 times. Last update was at 14/02/2009 13:20:41

[Email]
brrodo
JavaTeenager

Membro desde: 07/02/2009 23:31:16
Mensagens: 173
Offline

Ao instanciar objeto "d" (Derived) seu construtor chama primeiro o construtor da superclasse Base, implicitamente (super()), que vai invocar o método "addValue()" que foi sobrescrito na subclasse, fazendo "value" valer 20, após isso é executado o construtor da subclasse Derived, q adiciona mais 20 ao "value", resultando em 40.

Portanto, o método "addValue()" foi sobrescrito e não sobrecarregado, pois se fosse sobrecarregado, como a referência de "b" foi feita para a superclasse Base, o método "addValue" da subclasse não seria exergado qd fosse invocado.

This message was edited 1 time. Last update was at 14/02/2009 13:57:04

Daniel.F
GUJ Ranger

Membro desde: 29/03/2007 18:30:39
Mensagens: 909
Offline

Eu entendi que se trata sobreescrição.
O que eu não entendi é por que quando o construtor da superclasse e executado e chamado a versão sobeescrita do metodo??
Obrigado.
[Email]
victorwss
JWizard
[Avatar]

Membro desde: 18/12/2007 14:46:00
Mensagens: 2409
Localização: São Paulo - SP
Offline

Essa é a grande vantagem da sobrescrita. Você poder redefinir o método. Imagina que o método na superclasse fosse abstrato, o que aconteceria se ele fosse invocado e a superclasse não pudesse ver o método sobrescrito?

Sobrescrever significa "esqueça a implementação da superclasse e use isto no lugar".

Victor Williams Stafusa da Silva

Bacharel em Ciência da Computação - UFMT // Especialista em Desenvolvimento Java - CEFET/MT // Doutorando em Ciência da Computação - IME-USP
SCJP 6.0 - 19/12/2007 - PASS - 88% // SCWCD 5 - 17/05/2008 - PASS - 79% // SCJA - 09/09/2008 - PASS - 96% // SCSNI - 30/06/2009 - PASS - 68% // SCBCD 5 - 31/05/2010 - PASS - 95%
Próximos: SCJD (encalhado com o projeto), SCEA parte I (estudando). Algum dia desses: SCMAD, OCA, SCEA e SCDJWS.

Computação: uma ciência holística e esotérica!
E então veio Deus a terra e disse aos homens: Não dividireis por zero.
XML is a giant step in no direction at all. (Erik Naggum)
Arquitetura de sistemas: Eu prefiro ser essa metamorfose ambulante do que ter aquela velha opinião formada sobre tudo.
Diga não as drogas: Não use java.util.Vector.
Cuidado: Este usuário pode ter temperamento agressivo.

Always code as if the person who will maintain your code is a maniac serial killer that knows where you live.
I am the maniac serial killer that knows where you live who will maintain your code.


É impossível falar de CMMI (Capability Maturity Model Integration) sem saber o que é CIMM (Capability Im-Maturity Model).


Se você escreve "concerteza", "concerteza" você andou matando aulas de português.
[MSN]
lipe82
Debugger
[Avatar]

Membro desde: 28/04/2006 10:59:33
Mensagens: 61
Offline

Cara, isso é muito fácil de confundir! Muito bom exemplo!

Na primeira vez q eu vi parecia-me que vc estava chamando b.addValue() e não b.getValue(). Mesmo acessando o contrutos da superclasse ele ainda usa o método sobreescrito. Então instanciando uma variável da subclasse o método da superclasse não será útil mais. Mesmo qd foi chamado dentro do construtor da superclasse.

Mas... olha só o que eu fiz tentando estudar um pouco mais o código

Coloquei o método da superClasse como private. Resultado... o código compila, porém o método addValue não é sobreescrito, então o primeiro contrutor que roda, o da classe Base é obrigado a chamar o método addValue da classe Base e depois o segundo contrutor que roda, da classe Derived chama o método addValue() da classe Derived.

Resultado:
To sendo chamado na classe base
To sendo chamado na classe Derived
30

É nóis estudando pra certificação....

This message was edited 1 time. Last update was at 17/02/2009 08:24:28

[WWW]
Jair Rillo Junior
Moderador
[Avatar]

Membro desde: 29/04/2003 21:19:53
Mensagens: 2524
Localização: São Paulo / Campinas
Offline

Apesar que isso possa ser fácil de confundir, ele pode ser um grande aliado no dia a dia. Dê uma pesquisada sobre Template methods pattern e você vai entender melhor essa parte de sobreescrita e como ela pode te ajudar no dia a dia.

Jair Rillo Junior

http://www.jairrillo.com/blog | Twitter | SCJA, SCJP, SCWCD, SCBCD, IBM SOA Associate
Daniel.F
GUJ Ranger

Membro desde: 29/03/2007 18:30:39
Mensagens: 909
Offline

Ficou legal tópico bastante esclarecedor.
Valeu pessoal.


[Email]
antwort
What is classpath?
[Avatar]

Membro desde: 05/05/2009 20:33:13
Mensagens: 7
Offline

Muito legal eu ter topado isso aqui, eu vou prestar a OCJP e se caisse esse tipo de coisa nem sei o que eu responderia.
Vlw galera.

This message was edited 1 time. Last update was at 14/11/2011 12:15:14

ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20570
Localização: Curitiba/PR
Offline

Jamais chame métodos sobrescritos no construtor da classe.
Lembrem-se que a construção ocorre de cima para baixo, portanto, você estará chamando um método de um trecho da classe que sequer foi construído ainda.

O comportamento disso é completamenteindefinido. E, mesmo onde não der erro, será inconsistente também.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team