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?
t+, e obrigado!
Questão 18/20 - Considere o seguinte c�digo:
public class B {
public static String classe() {
return "Classe B";
}
}
public class A extends B{
public static String classe() {
return "Classe A";
}
public static void main(String[] x){
B b = new A();
System.out.println(b.classe());
}
}
Qual o resultado?
Erro no m�todo classe da classe A
Erro de compila��o
Classe B (*MARCADA COMO SENDO A ALTERNATIVA CORRETA)
Classe A
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.
Olha esse exemplo:
[code]public class Test {
static String s;
public static void main(String[] args) {
System.out.println(s.valueOf(1));
}
}[/code]
Era esperado um NullPointerException, mas não é oq ocorre! Ele imprime 1 e isso ilustra melhor a sua questão.
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.
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)
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.
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
[quote=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
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.