Classes Internas (Java)/Gato e Estômago/Classe interna implementa interface

From Wiki**3

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

Interface Estômago

 interface Estômago {
   void digere();
 }

Classe Gato

Note-se que a classe interna, EstômagoDeGato, é privada, não sendo possível instanciá-la a partir de código exterior ao da classe Gato.

 public class Gato {
   private boolean _comFome = true;
 
   private class EstômagoDeGato implements Estômago {
     private double _ph = 1.4;
     private boolean _comBolaDePelo = false;
     EstômagoDeGato() { System.out.println("Estômago criado"); }
     public void digere() {
       System.out.println("Digestão");
     }
     void eliminaBolaDePêlo() {
       System.out.println("Bola de pêlo... ghh, gaah, ghh... eliminada");
       _comFome = false;
     }
   }
 
   Gato() { System.out.println("Gato criado"); }
   public Estômago getEstômago() { return new EstômagoDeGato(); }
   public boolean temFome() { return _comFome; }
   public void comer() {
     System.out.println("Gato: a comer...");
     EstômagoDeGato e = new EstômagoDeGato();
     e.digere();
     e.eliminaBolaDePêlo();
   }
 }

Teste

 public class Teste3 {
   public static void main(String[] args) {
     Gato g1 = new Gato();
     System.out.println("Gato 1 com fome: " + g1.temFome());
     g1.comer();
     System.out.println("Gato 1 com fome: " + g1.temFome());
 
     Gato g2 = new Gato();
     System.out.println("Gato 2 com fome: " + g2.temFome());
 
     //--- coisas estranhas...?
     // Estômago e = new Estômago();            // erro: "Estômago" é uma interface
     // Estômago e = g2.new EstômagoDeGato();   // erro: "EstômagoDeGato" é privada
     Estômago e = g2.getEstômago();      // ok: "e2" é o Estômago de "g2"
     e.digere();                         // ok: classe é privada, mas método é público
 
     System.out.println("Gato 2 com fome: " + g2.temFome());
   }
 }

Resultados

 $ java Teste3
 Gato criado
 Gato 1 com fome: true
 Gato: a comer...
 Estômago criado
 Digestão
 Bola de pêlo... ghh, gaah, ghh... eliminada
 Gato 1 com fome: false
 Gato criado
 Gato 2 com fome: true
 Estômago criado
 Digestão
 Gato 2 com fome: true
 $ ls
 Estômago.java Estômago.class
 Gato.java Gato.class Gato$EstômagoDeGato.class
 Teste3.java Teste3.class