Classes Internas (Java)/Carros e Motores
From Wiki**3
Os exemplos seguintes apresentam algumas possibilidades de extensão (herança) de classes internas e externas.
Classes externas e internas
- Duas classes externas relacionadas entre si:
CarroeCarroEléctrico(esta subclasse da primeira). - Duas classes internas relacionadas entre si, mas pertencendo cada uma a sua classe externa.
Note-se que não há qualquer problema em reutilizar nomes de classes internas em múltiplas classes externas, uma vez que a sua identificação se faz de forma relativa ao contexto em que são definidas.
Carro
public class Carro {
protected String _estado;
abstract class Motor {
abstract void ligar();
abstract void desligar();
}
class Motor0 {
Motor0(String estado) {
_estado = estado;
System.out.println("Motor0 criado (" + _estado + ")");
}
}
Carro() { System.out.println("Carro criado"); }
void andar() { System.out.println("andar"); }
}
Carro Eléctrico
public class CarroEléctrico extends Carro {
class Motor extends Motor0 {
Motor() { super("LIGADO"); }
void ligar() { _estado = "LIGADO"; System.out.println("Motor " + _estado); }
void desligar() { _estado = "DESLIGADO"; System.out.println("Motor " + _estado); }
}
CarroEléctrico() { System.out.println("Carro eléctrico criado"); }
void andar() {
super.andar();
Motor m = new Motor();
m.ligar();
System.out.println("andar eléctrico");
m.desligar();
}
}
Teste
public class Teste7 {
public static void main(String[] args) {
Carro c = new Carro();
c.andar();
Carro e = new CarroEléctrico();
e.andar();
}
}
Resultados
$ java Teste7 Carro criado andar Carro criado Carro eléctrico criado andar Motor0 criado (LIGADO) Motor LIGADO andar eléctrico MotorDESLIGADO
$ ls Carro.java Carro.class Carro$Motor.class Carro$Motor0.class CarroEléctrico.java CarroEléctrico.class CarroEléctrico$Motor.class Teste7.java Teste7.class
Classe externa deriva de classe interna
Especialização de classe interna
- Carro & Motor (overriding de classes internas) (problemas)