toString() no Garoto Zumbi

Veja abaixo como a classe GarotoZumbi foi modificada. O método mostra() que mostrava o zumbi no console foi substituído pelo método toString() que retorna uma String com o desenho do zumbi (mas não o imprime). Com essa nova versão, você precisa receber e imprimir no console da seguinte maneira:

System.out.println(garoto.toString());

Os outros métodos também deixaram de imprimir o desenho do zumbi e agora você precisa fazê-lo explicitamente.


In [ ]:
public class GarotoZumbiBase {
    protected int idade;
    protected String estado;
    protected String nome;
    
    public GarotoZumbiBase(int idade, String estado, String nome) {
        this.idade = idade;
        this.estado = estado;
        this.nome = nome;
    }
    
    public String toString(boolean imprimeNome) {
        String resultado = "";
        
        // cabeleira
        if (idade >= 2)
            resultado += "  *\n";
        
        // corpo com olhos
        if (estado.equalsIgnoreCase("acordado"))
            resultado += " o*o\n";
        else
            resultado += " -*-\n";
        
        // barba
        if (idade >= 3)
            resultado += "*****\n";
        
        if (imprimeNome) {
            resultado += nome + "\n";
            resultado += "\n";
        }
        
        return resultado;
    }
    
    public void cresce() {
        if (idade < 3)
            idade++;
    }
    
    public void acorda() {
        estado = "acordado";
    }
    
    public void dorme() {
        estado = "dormindo";
    }
}

In [ ]:
public class GarotoZumbi extends GarotoZumbiBase {
   public GarotoZumbi(int idade, String estado, String nome) {
       super(idade, estado, nome);
   }
    
    public String toString() {
        return toString(true);
    }
}

In [ ]:
GarotoZumbi garoto = new GarotoZumbi(1, "acordado", "Asdrubal");
System.out.println(garoto.toString());
garoto.dorme();
System.out.println(garoto.toString());
garoto.cresce();
System.out.println(garoto.toString());

Método toString() de Object

O nome do método toString() não foi escolhido por acaso. Ele é um método que está defininido na classe especial Object, que é aquela classe de onde descencem implicitamente todas as classes. Quando você não sobrescreve o método toString() ele retorna uma String o endereço do objeto na memória.

O método toString() é chamado implicitamente toda vez que você pede para imprimir um objeto sem indicar o método, portanto, no exemplo a seguir:

GarotoZumbiBase garotob = new GarotoZumbiBase(1, "acordado", "Asdrubal");
System.out.println(garotob);

Ele imprime umas sequências estranhas que são a identificação única do objeto na memória.

Entretanto, se você sobrescreve o método toString(), através do polimorfismo, o novo método será chamado implicitamente quando você pede para imprimir o objeto. Por exemplo:

GarotoZumbi garoto = new GarotoZumbi(1, "acordado", "Asdrubal");
System.out.println(garoto);
garoto.dorme();
System.out.println(garoto);
garoto.cresce();
System.out.println(garoto);

Imprime o desenho do GarotoZumbi.


In [ ]:
GarotoZumbiBase garotob = new GarotoZumbiBase(1, "acordado", "Asdrubal");

System.out.println("=== Garoto Zumbi Base");
System.out.println(garotob);

System.out.println("===============================");

GarotoZumbi garoto = new GarotoZumbi(1, "acordado", "Asdrubal");

System.out.println("=== Garoto Zumbi");
System.out.println(garoto);
garoto.dorme();
System.out.println(garoto);
garoto.cresce();
System.out.println(garoto);

Exercício

Considere os herdeiros Monstro e Perfeito abaixo implementados à moda antiga com o método mostra() (eles não funcionarão agora se você tentar executá-los porque a superclasse -- GarotoZumbi -- não tem mais o mostra()).

Adapte ambos para que passem a ter o método toString() que retorna o desenho na forma de String, substituindo o mostra().


In [ ]:
public class Monstro extends GarotoZumbi
{
    public Monstro(int idade, String estado, String nome) {
        super(idade, estado, nome);
    }

    public void mostra(boolean imprimeNome) {
        super.mostra(false);

        if (idade >= 4)
            System.out.println("#####");
        if (idade >= 5)
            System.out.println("/   \\");

        if (imprimeNome)
            System.out.println(nome);
    }

    public void cresce() {
        if (idade < 5)
            idade++;
        mostra();
    }
}

In [ ]:
Monstro monst = new Monstro(1, "acordado", "Bonerges");
monst.mostra();
monst.cresce();
monst.cresce();
monst.cresce();
monst.cresce();
monst.cresce();
monst.dorme();

In [ ]:
public class Perfeito extends GarotoZumbi
{
    private String situacao = "normal";
    
    public Perfeito(int idade, String estado, String nome) {
        super(idade, estado, nome);
    }

    public Perfeito(int idade, String estado, String nome, String situacao) {
        super(idade, estado, nome);
        this.situacao = situacao;
    }

    public void mostra() {
        System.out.println("+-----+");

        if (idade >= 2)
            System.out.println("|     |");

        if (estado.equals("dormindo")) {
            System.out.println(" - -");
            System.out.println("|  _  |"); }
        else if (situacao.equals("normal")) {
            System.out.println("| o-o |");
            System.out.println("| ___ |"); }
        else if (situacao.equals("milionario")) {
            System.out.println("| $-$ |");
            System.out.println("| ___ |"); }
        else if (situacao.equals("doido")) {
            System.out.println("| @-@ |");
            System.out.println("|  ~  |");
        }

        if (idade < 3)
            System.out.println(" \\___/");
        else {
            System.out.println("|     |");
            System.out.println("\\_____/");
        }

            System.out.println(nome);
    }

    public void mudaSituacao() {
        String s[] = {"normal",
                      "milionario",
                      "doido" };

        int p;
        for (p = 0; p < s.length && !situacao.equals(s[p]); p++)
            /* nada */ ;

        p = (p + 1) % 3;
        situacao = s[p];

        mostra();
    }
}

In [ ]:
Perfeito perf = new Perfeito(1, "acordado", "Zandor");
perf.mostra();
perf.cresce();
perf.cresce();
perf.mudaSituacao();
perf.mudaSituacao();

Exercício

Dada a classe Servicos, a seguir, crie nela um método estático chamado imprimeZumbi. Esse método deve receber como parâmetro uma referência para um objeto da classe GarotoZumbi (considere a nova versão com toString()), ou um de seus herdeiros, e deve imprimi-lo.

Utilize uma solução que explore o polimorfismo, sem o uso de condicional.


In [ ]:
public class Servicos {
    
}