Classes Internas (Java)/Carros e Motores: Difference between revisions
From Wiki**3
< Classes Internas (Java)
(→Teste) |
|||
Line 64: | Line 64: | ||
} | } | ||
== Resultados == | === Resultados === | ||
<FONT COLOR="#993366"><B>$ java Teste7</B></FONT> | <FONT COLOR="#993366"><B>$ java Teste7</B></FONT> |
Revision as of 18:07, 23 October 2013
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:
Carro
eCarroElé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
Este exemplo apresenta quatro classes: duas internas e duas externas. A relação entre as classes internas é de herança; a relação entre as classes externas também é de herança.
Pretende-se demonstrar a utilização de classes internas quando há reutilização por herança. Note-se que cada classe externa utiliza sempre as suas classes internas, independentemente de o objecto em causa ser de uma subclasse.
Carro
public class Carro { protected class Motor { Motor() { System.out.println("Motor"); } } public Carro() { System.out.println("Carro"); Motor m = new Motor(); } }
Carro Eléctrico
public class CarroEléctrico extends Carro { protected class Motor extends Carro.Motor { Motor() { System.out.println("Motor eléctrico"); } } public CarroEléctrico() { System.out.println("Carro eléctrico"); Motor m = new Motor(); } }
Teste
public class Teste9 { public static void main(String[] args) { new CarroEléctrico(); } }
Resultados
$ java Teste9 Carro Motor Carro eléctrico Motor Motor eléctrico
$ ls Carro.java Carro.class Carro$Motor.class CarroEléctrico.java CarroEléctrico.class CarroEléctrico$Motor.class Teste9.java Teste9.class