Classes Internas (Java)/Gato e Estômago/Classe interna implementa interface
From Wiki**3
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