Bom dia galera, estou estudando o livro de certificação e me surgiu uma dúvida referente a métodos estáticos.
Fiz um exercício composto pelas seguintes classes:
public class Singer {
public static String sing() { return "la"; }
}
public class Tenor extends Singer {
public static String sing() { return "fa"; }
public static void main(String[] args) {
Tenor t = new Tenor();
Singer s = new Tenor();
System.out.println(t.sing() + " " + s.sing());
}
}
Segue a pergunta do livro: Dadas as classes acima, aponte a alternativa correta:
A. fa fa
B. fa la
C. la la
D. Compilation fails
E. An exception is thrown at runtime
Eu respondi a alternativa D, mas o livro apontou a B como correta. Fiz a prova na IDE e funciona realmente, porém ele deixa um warning na linha 6 da classe tenor, justamente dizendo que os métodos deveriam ser(should be) acessados de modo estático.
Até então eu havia aprendido que pra acesso de variáveis, constantes e métodos estáticos deve-se usar o nome da classe ponto nome do método, e nem sabia que poderia acessar através de variáveis de referência, nunca tentei isso por ter aprendido do outro modo.
Aí fica a pergunta principal: Acessar estáticos com variáveis de referência é possível, porém não é indicado. Isso é considerado CERTO ou NÃO? Até onde eu aprendi nesses 8 meses de aprendizado contínuo da linguagem, essa não é uma boa prática. LOGO não deve ser seguida, e muito menos apontada como certa no livro da certificação…
Fica complicado aprender de professores e colegas com mais experiência que algo é errado, e depois ver no livro de certificação que os autores consideram essa prática correta. E a própria IDE diz que deveria ser de outro modo…
O que vocês acham? Aprendi errado?
OBS: É o livro SCJP6 versão em Inglês.