Bom, tenho o código abaixo, que tem a saída: “high high”
public class A{
private String runNow(){
return "High";
}
static class B extends A{
public String runNow(){
return "Low";
}
}
public static void main(String args[]){
A[] a=new B[]{new B(),new C()};
for(A aa:a)
System.out.print(aa.runNow()+" ");
}
}
class C extends A.B{
public String runNow(){
return "Out";
}
}
Eu imagino que o motivo seja o seguinte (Me corrijam se eu estiver errado) : Quando tentamos chamar o método “aa.runNow()” do objeto B, o compilador começa procurando pela superclasse (no caso a classe A) e como verifica que na classe A tem um método runNow() PRIVADO, ele já deduz que não haverá nenhum “override” para este método nas subclasses, por isso executa logo o runNow() da classe A.
O mesmo ocorre quando executamos o runNow() do objeto C, ele vai lá na classe A e verifica que o runNow() é privado e que não pode ser sobrescrito e executa logo. Ou seja, o conceito de polimorfismo não se aplica aqui, já que o runNow() da classe A é privado.