A interface Estômago
(implementada pela classe interna anónima) é como anteriormente.
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 } } }
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()); } }
$ 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