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:
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.
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