Curiosidade

7 respostas
fbanin

Olhe os códigos:

Classe: Pai.java

public class Pai{

	static String nome = "PAI";

	static void printNome(){

		System.out.println("PAI -> " + nome);

	}

}

Classe: Filho.java

public class Filho extends Pai{

	public Filho(){

		nome = "FILHO";

	}

}

Classe: TestePaiFilho.java

public class TestePaiFilho{

	public static void main(String args[]){

		Pai p   = new Pai();
		Filho f = new Filho();

		p.printNome();
		f.printNome();

	}

}

Sem implementar… qual será a saída !!!

7 Respostas

Rafael_Nunes

Pai -> Filho Pai -> Filho

Eu creio que é por duas razões.
1 - Porque nome(PAI) é estática, e no método printNome, ele buscar a variável de instância.
2 - Porque não existe overreader de variáveis, logo, ele assumirá a variável do tipo do objeto.

Mas são só achismos por enquanto…

fbanin

é essa saída mesmo…

Como eu não criei uma variavel para a classe Filho, ele usa a da pai… agora o que fiquei na dúvida foi, no TestePaiFilho eu criei duas instancias… logo seriam dois objetos diferentes, uma para PAI e outra para FILHO, pq ele assume o mesmo nome para as duas instâncias ?! Ele não deveriai ter como saída p.printNome() -> PAI -> PAI ??

skill_ufmt

Ele vai imprimir FILHO, FILHO

static garante uma instancia, mas não a imutabilidade da variável.

Antes que perguntem porque não imprime PAI e depois Filho, primeiro ele agirá sobre filho, mudará o valor da variável, e então irá imprimir o valor da classe pai. (acho que é isso).

Isso se não me engano é uma das dicussões en torno do sigleton, visto que alguns modelos como do GOF, se não me engano, ele assumem static para garantir uma unica instância, mas acontece que essa instancia poderá ser alterada em seu valor.
Alguns dizem que o verdadeiro singleton tem que ter o “final” e o “static”, mas creio que os dois casos são permitidos, vai depender das suas necessidades.

cu_ringa

pelo q sei a variavel nome da classe Pai ja existe antes de vc instanciar um objeto da classe Pai, ja q a variavel nome e static, ai qnd vc cria um objeto da classe Filho ele vai colocar na variavel nome da classe Pai o valor FILHO, entao qnd vc for chamar os metodos eles vao mostrar a mesma coisa. Agora se vc fizesse assim:

Pai p   = new Pai();
p.printNome();
Filho f = new Filho();
f.printNome();

ai creio eu q vai mostrar resultados diferentes.

skill_ufmt

cu_ringa:

ai creio eu q vai mostrar resultados diferentes.

Não irá mostrar resultados diferentes caro cu_ringa, como disse a variável nome já existirá, porém ela só sera impressa pela classe Pai, após ser impressa pela classe filho, mas na classe filho ocorre a alteração do valor para “FILHO”, quando do retorno a classe pai a variável nome já se encontra com este valor e então é impressa, uma espécie de recursão.

cu_ringa
public class TestePaiFilho{
 
 	public static void main(String args[]){
 
 		Pai p   = new Pai();
 		Filho f = new Filho();
 
 		p.printNome();
 		f.printNome();
 
 	}
 
 }

skill_ufmt escreveu:

skill_ufmt, discordo de vc. Do jeito que a classe TestePaiFilho foi escrita a classe a variavel nome será impressa prmeiro pela classe Pai e depois pela classe Filho. Agora concordo com vc na hora em q a classe Filho sobrescreve a variavel nome, e assim qnd for imprimida a variavel nome o resultado e FILHO nos 2 casos.

skill_ufmt, acho q vc num viu a ordem em q coloquei as chamadas.

skill_ufmt

cu_ringa:

skill_ufmt, acho q vc num viu a ordem em q coloquei as chamadas.

Sim cu_ringa, do jeito dele é repetido ao valor, do seu modo realmente são diferentes, o esquema está na instanciação dos objetos :wink:

Abraços

Criado 19 de abril de 2005
Ultima resposta 19 de abr. de 2005
Respostas 7
Participantes 4