Qual é a saída?


class A{
    A(){
             x();
    }

    void x(){
          System.out.print("1");
    }
} 

public class B extends A{
    B(){
             super();
    }

    void x(){
          System.out.print("2");
    }

    public static void main(String args[]){
            A a = new B();
            B b = new B();
    }
} 

A) Não Compila
B) Lanca execao
C) 11
D) 22
E) 12

Acho q e b, acertei ??? :oops:

No no no.

acho que eh 12
na primeira vez ele utiliza o metodo x da classe A e na segunda sobrescreve o metodo na classe B… a nao ser que ele utilize o metodo da classe A entao sairia 11 mas boto fe que eh 12

ERREI ERA 22
nao vi que apesar da declarao ser da Classe A a instancia eh de B…
animal esse java polimorfico

Essa questão é realmente boa. Fiz baseada numa dúvida de um amigo.

Pasmem! A saída é 22!!!

Explicação:
Em Java todos os métodos são virtuais por default. E sempre será executado os métodos mais próximos do objeto, nunca da variável de referência. Tanto a variável a quanto b são inicializadas com instâncias da classe B. Assim o método x() herdado é sempre substituído pelo x() de B :wink:

Não acretida? Pode compilar e executar! Não estou drogado! :grin:

[color="#FF0000"]
Desafio[/color] Alguém consegue modificar a implementação do método x() de forma que a saída seja 11 ou 12??? (sem mexer na classe B) :xicote:

apenas mudando o modificar do metodo para private na classe A imprime 11

class A{
    A(){
             x();
    }

    private void x(){
          System.out.print("1");
    }
}

public class B extends A{
    B(){
             super();
    }

    void x(){
          System.out.print("2");
    }

    public static void main(String args[]){
            A a = new B();
            B b = new B();
    }
}

Ai está a resposta!

Mas agora pra imprimir 12 acho que não da hein?!?!?
ou alguem tem ideia de como fazer isso?!?!

cheguei atrasado =/

:viva:

Pô! Essa galera não perdoa mesmo! :grin: