Alguem poderia me explicar porque a resposta esse código não imprime “CLASSE A”? Não tem aquela regra que o método chamado é o do objeto instaciado? Dentro desse contexto, o método estático não foi subscrito de B?
Os membros estáticos são tambem conhecidos como membros de classe, ou seja são da classe declarada, as referencias a esses membros não tem relação com uma instância.
O recomendável nesse caso, para evitar confusão é sempre se referir os membros estáticos diretamente pelo nome da classe.
Era esperado um NullPointerException, mas não é oq ocorre! Ele imprime 1 e isso ilustra melhor a sua questão.
thiago.correa
Métodos estáticos e/ou privados não podem ser sobreescritos e nem sobrecarregados, o primeiro por não ser específico de uma instância e o outro é devido a visibilidade.
D
Daniel_ICMC
A questão é que para métodos estáticos, quem define qual método será chamado é o TIPO da variável de referência (ao contrário dos métodos subscritos “normais”, que são definidos em tempo de execução pelo tipo do objeto em questão)
victorwss
Podem ser sobrecarregados sim, só não podem ser sobrescritos.
mrcastro
Nesse caso, a classe A apenas está criando um novo método, e nem toma conhecimento do método de B? é isso?
volnei
Mais ou menos isso… na verdade cada classe tem sua própria implementação do método, e como já citado acima a implementação é da classe e não da instancia.
mrcastro
Pessoal…eu acabei de ler aqui no Livro da KS, tava até desconfiado disso, por isso fui conferir.
public static void main(String[] x){
B b = new A();
System.out.println(b.classe());
}
Na linha 2 desse trecho do código, cria-se uma referência a B, mas passa-se um objeto A para ele, até aí nenhum problema, já que A É UM B. Só que o “compilador só verifica o tipo da referência, e não o da instância”
Será que não é essa a explicação do problema?
posso até estar parecendo teimoso, mas fiquei encucado com iso
[]'s
Matheus
volnei
É tudo que foi dito acima, só que com outras palavras… :?
W
wagner_cri
Brigado aí gente. Não tem como não entender…
T
truck1n
mrcastro:
Pessoal…eu acabei de ler aqui no Livro da KS, tava até desconfiado disso, por isso fui conferir.
public static void main(String[] x){
B b = new A();
System.out.println(b.classe());
}
Na linha 2 desse trecho do código, cria-se uma referência a B, mas passa-se um objeto A para ele, até aí nenhum problema, já que A É UM B. Só que o “compilador só verifica o tipo da referência, e não o da instância”
Será que não é essa a explicação do problema?
posso até estar parecendo teimoso, mas fiquei encucado com iso
[]'s
Matheus
Correto!
J
javadev
Pense da seguinte forma: “Subscrição não é para estáticos” e ponto. O que acontece nesse caso é o que se chama de redefinição. Portanto, ao se deparar com algum código desse nem pense em subscrição, o método que será chamado é o do tipo da variável declarada e não do objeto ao qual ela referencia.