Metodos Estaticos não podem ser Herdados?

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…

Oi adriano, vamos supor que a classe derivada NÃO tivesse o metodo

 public static void metodoEstatico(){  
         System.out.println("Estatico Derivada");  
     }  

mesmo assim eu consigo chamar o metodo da classe base gerando o resultado Estatico Base , o que pode me dizer a respeito deste resultado

si= Santa Ines (MA) ??

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.

Espero ter ajudado.

[]'s

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”

A VM não procurará a Referência correta em tempo de execução, ela sempre retornará o método static da variável de Referência…

Herdar, herda, mas não sobrescreve…

Falows :wink:

Existem outros topicos explicando isto (por favor procurar!) , mas em resumo:

  1. 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)
  2. 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.
  3. é possivel impedir que um método estático seja redefenido usando a palavra final.
  4. 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.

Me explique por favor , como não há herança.



public class Main {

	public static String getStringEstatico(){

		return "Main";
	}

	public static String getDescricaoEstatico(){
		return "descricao = " + getStringEstatico();
	}

	public static void main(String[] args) {

		System.out.println(Main.getDescricaoEstatico());
		System.out.println(Teste.getDescricaoEstatico());
	}

}

public class Teste extends Main{

}
System.out.println(Teste.getDescricaoEstatico());

Pois consigo chamar apartir da subclasse.

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…

Abraços :wink: