[quote=Lys Marie][quote=rod.attack]Um método marcado static não pode ser sobrescrito, mas pode ser redefinido.
Baseado no exemplo que você postou acima, sto implica no seguinte:
[code]
public static void main(String[] args) {
Animal a= new Horse();
a.eat(); //em tempo de execução, se o método eat não for static, a jvm executa a versão da classe cavalo. Porém, se o método for static, a versão executada é a da classe Animal.
}
[/code][/quote]
Por acaso estou estudando este capítulo também…
Rod, isto significa que se o código fosse escrito assim:
[code]class Animal{
public static void eat(){
System.out.println(“Animal generico comendo genericamente”);
}
}
class Horse extends Animal{
public static void eat(){
System.out.println(“Cavalo comendo”);
}
}
public class TestAnimals {
public static void main(String[] args) {
Animal a = new Animal();
Animal h = new Horse(); //Antes estava como Horse h = new Horse()
a.eat();
h.eat();
}
}[/code]
Ele não iria compilar porque h.eat() estaria chamando o método eat() definido como static na classe Horse?
E uma outra pergunta: Caso o método eat() na classe Animal não fosse marcado como static, h.eat() chamaria o método na classe Animal?[/quote]
Um método marcado static, em tempo de execução, é chamado de acordo com o tipo da variável de referência. Ao contrário de um método de instância, que, em tempo de execução, é chamado de acordo com o tipo do objeto.
Ou seja, nesse exemplo h.eat() compilaria e rodaria sem problema nenhum. Por se tratar de um método estático, a JVM executa a versão do método contido na classe da variável de referência.