Galera em alguns estudos sempre vemos que metodos estaticos não podem ser Herdados, porem eu e um amigo fizemos um teste e vejam o resultado:
public class Base {
public static void metodoEstatico(){
System.out.println("Estatico Base");
}
}
public class Derivada extends Base {
public static void metodoEstatico(){
System.out.println("Estatico Derivada");
}
public static void main (String [] args){
Derivada.metodoEstatico();
}
}
e o pior ainda pude subescrever o metodo, o que vcs FERAS tem a dizer ??
Cara… só se eu estiver MUITO enganado… mas vc não sobrescreveu… como não herdou, apenas criou um novo método na classe Derivada e o chamou… clarom que funciona… 0 de sobrescrição…
Na verdade os métodos estáticos são herdados porém não são subescritos, o que você fez foi substituir o método, para você verificar isso faça o seguinte teste:
public class Pai {
public static void print() {
System.out.println("Pai Estatico");
}
}
public class Filho extends Pai {
public static void main(String[] args) {
print();
}
public static void print() {
Pai p = new Filho();
p.print();
}
}
Você vai ver que o método que é executado é o da classe Pai e não o da Classe Filho como acontece quando você realmente sobreescreve um método.
Pois é polimorfismo nao funciona com métodos staticos, vc herdou e sobrescreveu sim. E vc so consegue chamar o método da classe Base ou instanciando ela ou usando como static mesmo Base.metodoEstatico();
Seu teste honestamente não está testando o que você quer que seja testado.
Esse é o teste que você queria fazer:public class TestePai {
public static void metodoEstatico() {
System.out.println("Estatico Base");
}
}
[code]public class Teste extends TestePai {
private static final long serialVersionUID = 1L;
public static void metodoEstatico() {
System.out.println("Estatico Derivada");
}
public static void main(String[] args) {
TestePai.metodoEstatico(); // chamada correspondente a que você fez
Teste.metodoEstatico();
TestePai teste = new TestePai();
TestePai teste2 = new Teste();
System.out.println("=====");
teste.metodoEstatico();
teste2.metodoEstatico();
}
} // class
[/code]
Se você fazer a chamada ao método de forma static, realmente o método chamado será o que você desejava chamar.
Quando você chamou Derivada.metodoEstatico(), não se tem dúvida que você está direcionando ao método da classe Derivada
Porém o polimorfismo não trabalha com chamadas estáticas e sim com chamadas usando objetos.
No exemplo que passei, é criado 2 objetos, um Teste e um TestePai. Sendo que o Teste é atribuido à uma referência TestePai.
Seguindo o polimorfismo, quando eu faço a chamada do objeto teste2 (objeto de Teste), o resultado deveria ser a impressão de “Estático Derivada” mas como não há sobrescrita de métodos estáticos o que é imprimido é o método da referência (TestePai no caso) resultando na impressão de “Estatico Base”
Existem outros topicos explicando isto (por favor procurar!) , mas em resumo:
métodos estáticos não são herdados. Pelo fato de serem estáticos não pertencem aos objetos e portanto não ha herança. A prova é que não é possivel invocar o método original na classe pai. ( não existe acesso a super)
métodos estáticos não podem ser sobre-escritos. Eles podem ser redefinidos. Em tese é diferente pois apenas onde ha herança ha sobre-escrita, mas na prática a forma de escrever é a mesma e é isso que está confundindo vcs.
é possivel impedir que um método estático seja redefenido usando a palavra final.
A forma como a JVM procura métodos estáticos segue a hierarquia , é por isso que vc pode invocar um método estático definido na classe pai usando a classe filha. Esta pesquisa é semelhante à da herança e dai a confusão.
Herança implica em objetos, coisas estáticas - por definição - existem nas classes e não nos objetos. Logo, coisas estáticas não podem ser herdadas.
Não confundir escopo de acesso com herança. uma coisa é poder acessar, outra coisa é ser herdado.
A grande cagada está em entender o que é Herança… Não há herança de classes e sim de Objetos, lembrem-se uma classe se refere unicamente a um modelo de Objeto e não do Objeto em sí…
Como static não se refere a um Objeto, não ocorre herança, o que Ocorre é que o java faz esse favor pra ti, de procurar o método statico em todo o Projeto de estrutura do teu Objeto…
class Teste extends TesteHeranca
sempre que chamares Teste.metodoStatic(), a VM vai procurar em todos os .class do Objeto Teste, começando do mesmo e subindo na árvore de herança, mas do Projeto, não do Objeto, é a mesma variável que será alterada, mas não passa de açúcar sintático…
Quer fazer um teste… tenta chamar super dentro de um contexto static…