Dúvida ao chamar super.metodo(). [RESOLVIDO]  XML
Índice dos Fóruns » Certificação Java
Autor Mensagem
rmalati
Virtual Machine Man
[Avatar]

Membro desde: 26/11/2007 09:10:30
Mensagens: 593
Localização: Jundiaí-SP
Offline

Boa noite.

Surgiu uma dúvida nesse código ai:



A dúvida é com relação a variável de instância x herdada.
Qual o motivo de a chamada super.metodo() imprimir 11, já que ela chama o método da super classe?

Grato.

This message was edited 3 times. Last update was at 26/01/2010 22:53:11


Rodrigo Malatesta Barbosa
Graduando em Tecnologia Informática Unicamp
SCJP 1.6 - 93%

"A disciplina é o caminho mais curto para o sucesso"
"Se não puder destacar pelo talento, vença pelo esforço. (Provérbio indiano)"
[Email] [MSN]
peczenyj
Moderador
[Avatar]

Membro desde: 26/03/2006 23:25:37
Mensagens: 3191
Localização: Rio de Janeiro
Offline

Quando vc fez x=10 na classe pai vc criou um atributo de visibilidade 'padrão'.
A classe filha alterou o valor do atributo herdado da classe pai. Quando vc executou super.metodo vc invocou o codigo original. O que o codigo original faz? acessa this.x que, nesse objeto, vale 11.

Quer ver prevalecer o valor da classe pai? Faça x= 10 ser private.

Acho que vc esta confundindo com o contexto estatico também. Vc não esta acessando um estado na classe pai pois este estado não existe mais

http://pacman.blog.br

'Não importa quanto alguém se dedique à tarefa. Ninguém consegue fazer a água da cascata cair para cima.'
[WWW]
TiagoTC
JavaTeenager

Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline

Quando vc fez a atribuição x = 11 na classe Carro, a variável alterada foi na verdade a da classe Veículo (pois a classe carro não possui uma variável x). Logo após, quando vc faz super.metodo() vc está chamando o método da classe veículo que usa a mesma variável x que vc acabou de alterar.

Na linha de baixo ( new Veiculo().metodo(); ) vc está criando um novo objeto. E esse novo objeto possui o valor de x = 10 normal (vc não alterou ele). Por isso que ao chamar o método "metodo()" dele ele imprime 10.

O fato de uma classe A herdar uma variável de instância da classe B não implica que a classe A irá ter uma cópia da variável. Ela ira usar a mesma variável da classe B.

Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares
peczenyj
Moderador
[Avatar]

Membro desde: 26/03/2006 23:25:37
Mensagens: 3191
Localização: Rio de Janeiro
Offline

O termo correto seriam atributos. Gosto de pensar em variaveis como algo que eu crio no escopo de um método (ou bloco de codigo) que ira desaparecer com o termino do mesmo. Pensar em variaveis nesse caso é pensar que podem existir contextos globais como em outras linguagens.

http://pacman.blog.br

'Não importa quanto alguém se dedique à tarefa. Ninguém consegue fazer a água da cascata cair para cima.'
[WWW]
TiagoTC
JavaTeenager

Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline

peczenyj wrote:O termo correto seriam atributos. Gosto de pensar em variaveis como algo que eu crio no escopo de um método (ou bloco de codigo) que ira desaparecer com o termino do mesmo. Pensar em variaveis nesse caso é pensar que podem existir contextos globais como em outras linguagens.


Mas variáveis de instância não é a mesma coisa que atributos?

Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares
rmalati
Virtual Machine Man
[Avatar]

Membro desde: 26/11/2007 09:10:30
Mensagens: 593
Localização: Jundiaí-SP
Offline

peczenyj wrote:Quando vc fez x=10 na classe pai vc criou um atributo de visibilidade 'padrão'.
A classe filha alterou o valor do atributo herdado da classe pai. Quando vc executou super.metodo vc invocou o codigo original. O que o codigo original faz? acessa this.x que, nesse objeto, vale 11.

Quer ver prevalecer o valor da classe pai? Faça x= 10 ser private.

Acho que vc esta confundindo com o contexto estatico também. Vc não esta acessando um estado na classe pai pois este estado não existe mais


Então o fato de imprimir 11 é simplesmente devido a chamada this.x no método padrão, e this neste contexto se refere ao objeto da classe Carro, é isso?

Rodrigo Malatesta Barbosa
Graduando em Tecnologia Informática Unicamp
SCJP 1.6 - 93%

"A disciplina é o caminho mais curto para o sucesso"
"Se não puder destacar pelo talento, vença pelo esforço. (Provérbio indiano)"
[Email] [MSN]
rmalati
Virtual Machine Man
[Avatar]

Membro desde: 26/11/2007 09:10:30
Mensagens: 593
Localização: Jundiaí-SP
Offline

TiagoTC wrote:Quando vc fez a atribuição x = 11 na classe Carro, a variável alterada foi na verdade a da classe Veículo (pois a classe carro não possui uma variável x). Logo após, quando vc faz super.metodo() vc está chamando o método da classe veículo que usa a mesma variável x que vc acabou de alterar.


Tiago, eu discordo.
A variável x é defaul então ela é herdada sim pela subclasse e a variável alterada em Carro é a que essa classe herdou.

TiagoTC wrote:Na linha de baixo ( new Veiculo().metodo(); ) vc está criando um novo objeto. E esse novo objeto possui o valor de x = 10 normal (vc não alterou ele). Por isso que ao chamar o método "metodo()" dele ele imprime 10.

Concordo, eu vacilei aqui... rsrsrrs

TiagoTC wrote:
O fato de uma classe A herdar uma variável de instância da classe B não implica que a classe A irá ter uma cópia da variável. Ela ira usar a mesma variável da classe B.

Discordo também, se ela foi herdada, é como se ela tivesse sido declarada como atributo da classe Carro.

This message was edited 2 times. Last update was at 26/01/2010 21:43:49


Rodrigo Malatesta Barbosa
Graduando em Tecnologia Informática Unicamp
SCJP 1.6 - 93%

"A disciplina é o caminho mais curto para o sucesso"
"Se não puder destacar pelo talento, vença pelo esforço. (Provérbio indiano)"
[Email] [MSN]
evertonsilvagomesjava
GUJ Master
[Avatar]

Membro desde: 23/08/2009 13:14:01
Mensagens: 1924
Offline

cara vc esta alterando valor de uma variavel herdada ou seja no objeto que vc esta usando pra chamar o método vc esta realmente alterando o valor dela em Veiculo sim faça o teste com this.x que fica mais facil de enchergar:



para resolver o problema vc pode simplesmente declarar um "int x" na classe Car:


TiagoTC
JavaTeenager

Membro desde: 09/02/2008 01:12:58
Mensagens: 189
Offline

TiagoTC wrote:
O fato de uma classe A herdar uma variável de instância da classe B não implica que a classe A irá ter uma cópia da variável. Ela ira usar a mesma variável da classe B.

Discordo também, se ela foi herdada, é como se ela tivesse sido declarada como atributo da classe Carro.

Como assim rmalati? Não existe isso de "redeclaração implícita". A única forma de a classe Carro ter um atributo próprio é declarando ela explicitamente com int x (colocando o tipo antes, conforme o everton explicou). O que acontece é o seguinte: o método "metodo()" da classe Carro possui a atribuição x = 11. Primeiro ele vai procurar no escopo daquele método a variável x. Como não tem nenhuma declaração, ele vai para o escopo da classe Carro. Como também não tem nenhum atributo x declarado na classe Carro, ele então vai procurar nos atributos da classe que Carro herdou (no caso Veículo). Como Veículo possui x declarado, ele vai usar esse. Mas ele não copia o valor de x ou algo parecido. Ele vai usar exatamente esse x da classe Veículo.

This message was edited 1 time. Last update was at 26/01/2010 22:20:08


Pérola: "Nunca coloque seu celular em um forno de microondas, pois isso faz com que a bateria exploda" - Manuais de telefones celulares
rmalati
Virtual Machine Man
[Avatar]

Membro desde: 26/11/2007 09:10:30
Mensagens: 593
Localização: Jundiaí-SP
Offline

Pouts... num acredito...
agora finalmente eu entendi isso....

Estava enganado mesmo, mas agora clareou.
Eu tinha entendido que se uma classe um membro é como se esta classe tivesse declarado ela mesma.
Herda mesmo, mas existe somente uma variável, a que foi declarada na super classe.




Obrigado pessoal, isso ajuda a explicar algumas questões perdidas nos mocks.

Rodrigo Malatesta Barbosa
Graduando em Tecnologia Informática Unicamp
SCJP 1.6 - 93%

"A disciplina é o caminho mais curto para o sucesso"
"Se não puder destacar pelo talento, vença pelo esforço. (Provérbio indiano)"
[Email] [MSN]
rmalati
Virtual Machine Man
[Avatar]

Membro desde: 26/11/2007 09:10:30
Mensagens: 593
Localização: Jundiaí-SP
Offline

TiagoTC wrote:
Como assim rmalati? Não existe isso de "redeclaração implícita".


É Tiago eu achava que era uma redeclaração implícita mesmo, valeu pela ajuda ai.

This message was edited 1 time. Last update was at 26/01/2010 23:00:53


Rodrigo Malatesta Barbosa
Graduando em Tecnologia Informática Unicamp
SCJP 1.6 - 93%

"A disciplina é o caminho mais curto para o sucesso"
"Se não puder destacar pelo talento, vença pelo esforço. (Provérbio indiano)"
[Email] [MSN]
 
Índice dos Fóruns » Certificação Java
Ir para:   
Powered by JForum 2.1.8 © JForum Team