Dúvida Questão ExamLab Polimorfismo

Pessoal,

segue a questão:

public class Teste{

     private String runNow(){
          return "High";
     }

     static class B extends Teste{
          
    	 public String runNow(){
               return "Low";
         }
     }

     public static void main(String args[]){
    	 
    	 Teste[] a=new B[]{new B(),new C()};
         
    	 for(Teste aa:a)
    		 System.out.print(aa.runNow()+" ");
     }

}


class C extends Teste.B{

     public String runNow(){
          return "Out";
     }

}

Saída: High High

Dúvida: Em tempo de execução as referências não seriam para as classes B e C ? Ou seja a saída seria: Low Out

???

Acho que já entendi. O método é private então ele não é herdado por B e C.

Então em tempo de execução, o array é de referencia a objetos Teste, então é localizado o método de Teste e não encontra métodos sobrescritos do mesmo, nem em B e nem em C.

Não é isso ?

Seria High High

Os métodos não estão sobreescrevendo o método de Teste, e sim sombreando. São os chamados shadow methods. Um método com modificador private não pode ser sobreescrito, nem na própria classe.

Perceba que se você fizer um cast de aa para B o output será Low Out.