E essa...?

15 respostas
Grinvon

Lembrando dos tempos de certificação e então me deparei com uma questão parecida com a que irei colocar agora. Não vale compilar o código, portanto tentem entender e sem rodar falar o resultado e dizer por que ele funciona assim ou assado. :wink:

package org.projeto.membros;

public class Mae {
	
	public String saida = "Mãe";
	
	public String mensagem() {
		return saida;
	}
	
	public Mae() {
		System.out.println(mensagem());
	}

}
package org.projeto.membros;

public class Filha extends Mae {

	public String saida = "Filha";
	
	@Override
	public String mensagem() {
		return saida;
	}
	
	public static void main(String[] args) {
		new Filha();
	}

}

Qual será o resultado, e por quê? :stuck_out_tongue:

15 Respostas

gugaa_df

Resposta é "Mãe"
Pq a classe filha é sub da classe mãe. então quando a filha é instanciada é invocado o construtor da super, no caso, o construtor da mãe.
O construtos da super chama o método mensagem que imprimi Mãe.
To certo?

Grinvon

Obrigado você gugaa_df a participar da Pegadinha da Certificação, logo após os comerciais irei falar se a resposta está certa ou errada, quem sabe até lá alguma outra pessoa poste a sua opinião. :slight_smile:

LPJava

eita que pegadinha boa… mais ai eu vou de “mae” o metodo é chamado na super classe… para chamar o da filha teria que ter um objeto da classe filha. Mas nesse caso ai ele vai chamar quem tiver executando o contrutor que é Mae.

:smiley:
Marcaria mae la no exame :?

gugaa_df

to curioso… hehehe

Grinvon

Não pessoal, parece que ele imprime “Mãe”, mas isso não é verdade. Ele imprime “null”. Sim isso mesmo, null, nem “Mãe” nem “Filha”.

A verdade que quando se chama o pai pela filha, o java tenta chamar o método mesagem da classe filha, porém a variável saida não está “pronta”, mesmo você usando a keyword como this para especificar no pai qual a variável que você quer, ele não iria conseguir chamar a variável que aponta para o conteúdo “Mãe”.

Se fosse diferente, ao invés da variável saída, fosse o conteúdo direto no próprio método, mesmo assim ele iria chamar o método da classe Filha ao invés da classe Pai.

Então como deveríamos chamar “Mãe” ao invés de “Filha”. Bom nesse caso teria que retirar a variável saida de Filha, e como saida em pai é public se tornará visível para Filha.

Mas e aí como faz para chamar a mensagem “Filha” então? Há duas maneiras, modificar ela para final e/ou para static em Filha, assim o compilador e o runtime iria encontrar ela instanciada antes de passar para o construtor.

Essa pegadinha a primeira vista parece ridícula mas não é. Abração a todos que participaram, beijocas!

Javabuntu

só por ser de certificação tem pegadinha ai gente… :smiley:
Posso estar errado, mas estou estudando pra certificação pelo livro da Sierra…qq coisa eu mato ela :lol:

a instância da filha vai chamar seu construtor, que chama o da super…q chama o mensagem()…blz…

muito na cara eu diria q seria “Mãe”…

mas pra eu recuperar a string saida com o valor “Mãe” eu teria q ter um getSaida…ai sim ela traria o valor da variável de instância…

neste o metodo mensagem() vai retornar o valor DEFAULT do tipo de retorno declarado…
como ele ta public String mensagem(){xxx}

ele vai retornar NULL…
se ele fosse

public int mensagem(){xx}
ele iria retornar 0

pelo menos o que entendi estudando o conceito pelo livro seria isso quanto ao tipo de acesso as variáveis de instância…mas não garanto NADA. :slight_smile:

Javabuntu

complementando…
se eu tiver certo…acho q assim seria impresso “Mãe”…

public String getSaida(){ return saida; }
e no construtor assim

public Mae() { System.out.println(getSaida()); }

mas posta ai q to curioso…

gugaa_df

Javabuntu:
complementando…
se eu tiver certo…acho q assim seria impresso “Mãe”…

public String getSainda(){ return saida; }
e no construtor assim

public Mae() { System.out.println(getSainda()); }

mas posta ai q to curioso…


O fato do método estar correto em relação ao padraõ JavaBean, nao influenciará em nada o resultado…

Javabuntu


O fato do método estar correto em relação ao padraõ JavaBean, nao influenciará em nada o resultado…

neste caso, tem certeza disso?

continuo com minha opinião por enquanto…mas posso estar errado claro…

Grinvon

Javabuntu:

O fato do método estar correto em relação ao padraõ JavaBean, nao influenciará em nada o resultado…

neste caso, tem certeza disso?

continuo com minha opinião por enquanto…mas posso estar errado claro…

Não, nesse caso o nome do método não iria influenciar em nada o resultado. :wink:

G

Grinvon:
Javabuntu:

O fato do método estar correto em relação ao padraõ JavaBean, nao influenciará em nada o resultado…

neste caso, tem certeza disso?

continuo com minha opinião por enquanto…mas posso estar errado claro…

Não, nesse caso o nome do método não iria influenciar em nada o resultado. :wink:

Legal a questão.
Eu ia fácil marcar na prova mãe também. :frowning:
Não tinha reparado que o método mensagem estava sobreescrito… :?

[]s
Gunnar

R

Grinvon:
Javabuntu:

O fato do método estar correto em relação ao padraõ JavaBean, nao influenciará em nada o resultado…

neste caso, tem certeza disso?

continuo com minha opinião por enquanto…mas posso estar errado claro…

Não, nesse caso o nome do método não iria influenciar em nada o resultado. :wink:

Bom, nesse caso do Javabuntu pode não ter sido o efeito que ele queria demonstrar, mas acaba tendo um resultado diferente… se vc interpretar como ta no codigo que ele escreveu, ou seja, se ele mudar na classe Mae o nome do metodo para getSaida() e chama-lo no construtor, o metodo mensagem() na classe Filha nao estaria sobrescrevendo o metodo getSaida() da classe Mae e, nesse caso, a resposta seria “Mãe”, como esperado, ao invés de “null”.

  • Claro que não teria nada a ver com o fato de o nome estar no padrão JavaBean… e sim pelo fato de que não estaria havendo sobrescrita.
fujioka

Acho que não vai escrever nada na saida, ou vai lançar alguma exceção pois o compilador não saberia qual variável chamar… pois a classe filha não pode sobrescrer uma variavel de instância…

public String saida = “Mãe”;

public String saida = “Filha”; se aqui fosse public string alguma coisa que não fosse String saida… não teria problema… e seria impresso Mãe, mas como o compilador não sabe qual sera então ou não escreve nada ou lança uma exceção… ta dificil… depois daqui vou pro eclipse ver o que vai dar…

gugaa_df

fujioka:
Acho que não vai escrever nada na saida, ou vai lançar alguma exceção pois o compilador não saberia qual variável chamar… pois a classe filha não pode sobrescrer uma variavel de instância…

public String saida = “Mãe”;

public String saida = “Filha”; se aqui fosse public string alguma coisa que não fosse String saida… não teria problema… e seria impresso Mãe, mas como o compilador não sabe qual sera então ou não escreve nada ou lança uma exceção… ta dificil… depois daqui vou pro eclipse ver o que vai dar…


Nao há problema nenhum se a classe filha sobrescrever uma variável de instancia. Oq acontece na verdade é que nao existe um sobrescrita aí, e sim um redefinição.

F

Grinvon:
Não pessoal, parece que ele imprime “Mãe”, mas isso não é verdade. Ele imprime “null”. Sim isso mesmo, null, nem “Mãe” nem “Filha”.

A verdade que quando se chama o pai pela filha, o java tenta chamar o método mesagem da classe filha, porém a variável saida não está “pronta”, mesmo você usando a keyword como this para especificar no pai qual a variável que você quer, ele não iria conseguir chamar a variável que aponta para o conteúdo “Mãe”.

Se fosse diferente, ao invés da variável saída, fosse o conteúdo direto no próprio método, mesmo assim ele iria chamar o método da classe Filha ao invés da classe Pai.

Então como deveríamos chamar “Mãe” ao invés de “Filha”. Bom nesse caso teria que retirar a variável saida de Filha, e como saida em pai é public se tornará visível para Filha.

Mas e aí como faz para chamar a mensagem “Filha” então? Há duas maneiras, modificar ela para final e/ou para static em Filha, assim o compilador e o runtime iria encontrar ela instanciada antes de passar para o construtor.

Essa pegadinha a primeira vista parece ridícula mas não é. Abração a todos que participaram, beijocas!


Nossa que pegadinha violenta!!to tonto!da confusao mas
desculpas ainda nao entendi pq o resultado é null pois a sobrescricao atrapalha em que ponto? E o pq o modificador final resolve??
obrigado pela atencao

Criado 26 de novembro de 2007
Ultima resposta 29 de nov. de 2007
Respostas 15
Participantes 8