toString()
no Garoto ZumbiVeja 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());
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);
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();
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 {
}