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]
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);
}
}
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.