Por que do resultado?!?

5 respostas
Guilherme_Gomes

Andei baixando uns SWs que postaram aqui no GUJ sobre exames e tal. No seguinte exercicio, não sei porque a saida dele é … não vou falar, quero que alguem que saiba consiga deduzir a saida e explicar por que ^^

class Base {
    int i;
    Base() { add(1); }
    void add(int v) { i += v; }
    void print() { System.out.println(i); }
}
class Extension extends Base {
    Extension() { add(2); }
    void add(int v) { i += v*2; }
    public long sum(long a, long b){
		return a+b;
	}
}
public class Aa {
    public static void main(String[] args) {
        bogo(new Extension());
    }
    static void bogo(Base b) {
        b.add(8);
        b.print();
    }
}

5 Respostas

diego2005

Bem, quando você faz:

O construtor de Extension é chamado, em seguida o construtor de Base é chamado, pois implicitamente tem uma chamada a super() no construtor de Extension.

Quando o construtor de Base é finalizado, i está valendo 2. Ai no construtor de Extension ele chama add(2). Então, quando o construtor de Extension é finalizado i está valendo 22…

Não sei se fui claro.

T+

acopiara

É isso ai, mas a primeira vez que é chamado o método add é no construtor base e essa chamada vai ser ao método subrescrito na classe Extension.

Guilherme_Gomes

Sinceramente, … não ^^

acopiara
class Base {
     int i;
     Base() { 
// 3 - chamado o metodo add da subclasse, pq o construtor foi chamado //pela subclasse - polimorfismo
add(1); }
     void add(int v) { i += v; }
     void print() { System.out.println(i); }
 }
 class Extension extends Base {
     
Extension() { 
// 2 - chamado o contrutor da superclasse
//4 - chamado o metodo add
add(2); }
     void add(int v) { i += v*2; }
     public long sum(long a, long b){
 		return a+b;
 	}
 }
 public class Aa {
     public static void main(String[] args) {
        // 1 - Criado um objeto do tipo Extension
         bogo(new Extension());
     }
     static void bogo(Base b) {
       // 5 - chamado o metodo add do objeto Extension polimorficamente
         b.add(8);
        // 6 - chamado o metodo da super classe 
         b.print();
     }
 }
diego2005

Vamos lá então, vou fazer + uma tentativa, rsrsrsrs…

A seguinte linha:

Faz o seguinte:

1º - executa o construtor de Extension:

2º - no construtor de Extension a uma chamada implícita a super(), que ira executar o construtor de Base:

3º - a chamada a add(1) irá executar o método:

4º - (nesse ponto i é igual a 2) o construtor de Base é finalizado, então a execução volta pro construtor de Extension, que tem uma chamada a add(2), que executar o método:

5º - (nesse ponto i é igual a 6) o construtor de Extension é finalizado, então a execução vai para o método bogo, que tem uma chamada a add(8), que executa o método:

6º - (nesse ponto i é igual a 22) agora temos uma chamada a print, finalizando assim a execução…

Acho que agora melhorou um pouco, né???

T+

Criado 20 de julho de 2007
Ultima resposta 20 de jul. de 2007
Respostas 5
Participantes 3