Sobrescrever Método Static?[RESOLVIDO]

Galera, boa noite, estou com uma dúvida de causada pela afirmação de que métodos static podem ser sobrescritos, abaixo segue os códigos:

public class Q {
	static int exibir(){
		return 10;
	}
}

Abaixo a classe que estende esta classe:

public class Z extends Q{
	static int exibir(){
		return 20;
	}

}

Tenho um livro que infelizmente não é o da Kathy que cita como uma das regras de sobrescrita que um método static pode ser sobrescrito se for herdado pela subclasse. Poderiam por favor me dar uma ajuda neste caso? Obrigado desde já.

Você não pode sobrescrever um método static, pode redefini-lo . Metodo static não se aplica no polimorfismo.

Olhe

[code]public class Classe1 {
public static void print() {
System.out.println(“print da Classe1”);
}

}[/code]

[code]public class Classe2 extends Classe1 {
public static void print() {
System.out.println(“print da Classe2”);
}

public static void main(String[] args) {
	Classe1 cl1 = new Classe1();
	Classe2 cl2 = new Classe2();

	// na verdade o q se ve abaixo é um 'atalho'
	cl1.print();
	cl2.print();

	// equivale a isso
	Classe1.print();
	Classe2.print();
}

}
[/code]

saída será:

print da Classe1
print da Classe2
print da Classe1
print da Classe2

asousaj

Obrigado pela dica, era bem isso que eu tinha entendido, mas sabe como é, quando a gente está estudando e um livro diz certas coisas a gente acaba acreditando, ou no meu caso, duvidando, acho que é sinal que tô prestando atenção no que leio, valeu mesmo. Abraço.

Complementando:

Em java você não pode sobrescrever metodos estáticos, pois não são metodos do objeto, e sim da classe. O que acontece ai, é que o método fica escondido, mas não sobreescrito. Um exemplo disso é se você fizer:

Classe1 c1 = new Classe2();
c1.print();

a saída será “print da Classe1”

[]'s

WRYEL

Valeu por mais essa dica, quero fazer a prova em fevereiro e todas as dicas pra ajudar são bem vindas, valeu mesmo.

Isso mesmo, pra ajudar a entender:

    public static void main(String[] args) {  
        Classe1 cl1 = new Classe1();  
        Classe2 cl2 = new Classe2();  
  
        // na verdade o q se ve abaixo é um 'atalho'  
        cl1.print();  //Classe: Classe1. Objeto: Classe1
        cl2.print(); //Classe: Classe2. Objeto: Classe2
        cl1 = cl2;
        cl1.print(); //Classe: Classe1. Objeto: Classe2
    } 

A saída sera essa:

print da Classe1
print da Classe2 (o mesmo objeto com prints diferentes.)
print da Classe1 (o mesmo objeto com prints diferentes.)