Overriding de método estatíco

Tudo bem pessoal?

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

Categoria(s): Conceitos de Orienta��o a Objetos

nao existe subscricao de metodos estaticos :slight_smile:

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)

Podem ser sobrecarregados sim, só não podem ser sobrescritos.

Nesse caso, a classe A apenas está criando um novo método, e nem toma conhecimento do método de B? é isso?

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

[]'s
Matheus

É tudo que foi dito acima, só que com outras palavras… :?

Brigado aí gente. Não tem como não entender…

[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 :smiley:

[]'s
Matheus[/quote]
Correto!

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.

Abraços,

Javadev.