Overriding de método estatíco

12 respostas
W

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

12 Respostas

peerless

nao existe subscricao de metodos estaticos :slight_smile:

volnei

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:

public class Test {
	static String s;

	public static void main(String[] args) {
		System.out.println(s.valueOf(1));

	}
}

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

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

[]'s
Matheus

volnei

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

W

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

T

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


Correto!

J

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.

Criado 29 de setembro de 2008
Ultima resposta 7 de out. de 2008
Respostas 12
Participantes 9