Classes Internas (Java)/Gato e Estômago/Classe interna anónima

From Wiki**3

< Classes Internas (Java)‎ | Gato e Estômago

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