Duvida de herança

Ola pessoal, gostaria que fosse esclarecido essas duvidas por favor.

[code]
public class A {
public void M1(int i) { }
public void M2(int i) { }
public static void M3(int i) { }
public static void M4(int i) { }
}

public class B extends A {
public static void M1(int i) { }
public void M2(int i) { }
public void M3(int i) { }
public static void M4(int i) { }
}[/code]

(a) Que método sobrepõe outro método?
(b) Que método oculta outro método?
© O que ocorre com os demais métodos?

Cara. Primeiro olha o seguinte teste:

public class A {
    public void M1(int i) { System.out.println("M1 em A");}
    public void M2(int i) { System.out.println("M2 em A");}
    public static void M3(int i) { System.out.println("M3 em A");}    
    public static void M4(int i) { System.out.println("M4 em A");}
}

public class B extends A {
    public static void M1(int i) { System.out.println("M1 em B");}
    public void M2(int i) { System.out.println("M2 em B");}
    public void M3(int i) { System.out.println("M3 em B");}
    public static void M4(int i) {System.out.println("M4 em B");}
    
    public static void main(String[] args){
        System.out.println("Testando "A a = new A();"");
        A a = new A();
        a.M1(0);
        a.M2(0);
        a.M3(0);
        a.M4(0);

        System.out.println("Testando "B b = new B();"");        
        B b = new B();
        b.M1(0);
        b.M2(0);
        b.M3(0);
        b.M4(0);

        System.out.println("Testando "A ab = new B();"");        
        A ab = new B();
        ab.M1(0);
        ab.M2(0);
        ab.M3(0);
        ab.M4(0);
        
    }
}

Tenta compilar. Vai ver que não é possível. Depois altere B para ficar assim:

public class B extends A {
//    public static void M1(int i) { System.out.println("M1 em B");}
    public void M2(int i) { System.out.println("M2 em B");}
//    public void M3(int i) { System.out.println("M3 em B");}
    public static void M4(int i) {System.out.println("M4 em B");}
    
    public static void main(String[] args){
        System.out.println("Testando "A a = new A();"");
        A a = new A();
        a.M1(0);
        a.M2(0);
        a.M3(0);
        a.M4(0);

        System.out.println("Testando "B b = new B();"");        
        B b = new B();
//        b.M1(0);
        b.M2(0);
//        b.M3(0);
        b.M4(0);

        System.out.println("Testando "A ab = new B();"");        
        A ab = new B();
        ab.M1(0);
        ab.M2(0);
        ab.M3(0);
        ab.M4(0);
        
    }
}

Agora tente compilar e rodar. Sacou?

nem compila, pq nao se pode ter uma sobreposiçao de um metodo static

Peraí. Não é bem assim. Você chegou a tentar compilar?

O que acontece é o seguinte. Métodos não estáticos são amarrados ao objeto em questão. Já os métodos estáticos são amarrados à classe da variável de referência. Dessa forma, se tenho uma classe Pai e uma classe Filha tais que ambas implementem os métodos metodoEstatico() e metodoNaoEstatico() e faço:

Pai p = new Filha();
p.metodoEstatico();
p.metodoNaoEstatico();

será chamado metodoEstatico() da classe pai e metodoNaoEstatico(). E se fizermos:

Filha f = new Filha();
f.metodoEstatico();
f.metodoNaoEstatico();

Ambos métodos da classe Filha serão chamados.
E atenção. Aquele primeiro exemplo não compila pois você não pode sobrepor um método estático com um não estático e vice-versa. :wink: