Classes Internas (Java)/Gato e Estômago/Classe interna anónima
From Wiki**3
A interface Estômago (implementada pela classe interna anónima) é como anteriormente.
Classe Gato
public class Gato {
private boolean _comFome = true;
private Estômago _estômago = null;
Gato() { System.out.println("Gato criado"); }
public void caçar() { _comFome = true; }
public boolean temFome() { return _comFome; }
public void comer() {
if (_comFome) {
System.out.println("Gato: a comer...");
if (_estômago == null) {
_estômago = new Estômago() {
private double _ph = 1.4;
{
// block de iniciação: "construtor anónimo"
System.out.println("Estômago criado");
}
public void digere() {
System.out.println("Digestão");
eliminaBolaDePêlo();
}
void eliminaBolaDePêlo() {
System.out.println("Bola de pêlo... ghh, gaah, ghh... eliminada");
_comFome = false;
}
}; // ATENÇãO!
}
_estômago.digere();
// _estômago.eliminaBolaDePêlo(); // erro: não faz parte da interface
}
}
}
Teste
public class Teste6 {
public static void main(String[] args) {
Gato g = new Gato();
System.out.println("Gato com fome (antes de comer): " + g.temFome());
g.comer();
System.out.println("Gato com fome (depois de comer): " + g.temFome());
g.comer();
System.out.println("Gato com fome (depois de comer): " + g.temFome());
g.caçar();
System.out.println("Gato com fome (depois de caçar): " + g.temFome());
g.comer();
System.out.println("Gato com fome (depois de comer): " + g.temFome());
}
}
Resultados
$ java Teste6 Gato criado Gato com fome (antes de comer): true Gato: a comer... Estômago criado Digestão Bola de pêlo... ghh, gaah, ghh... eliminada Gato com fome (depois de comer): false Gato com fome (depois de comer): false Gato com fome (depois de caçar): true Gato: a comer... Digestão Bola de pêlo... ghh, gaah, ghh... eliminada Gato com fome (depois de comer): false
$ ls Estômago.java Estômago.class Gato.java Gato.class Gato$1.class Teste6.java Teste6.class