interface Estômago { void digere(); }
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(); } }
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()); } }
$ 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