Classes Internas (Java)/Carros e Motores: Difference between revisions
From Wiki**3
< Classes Internas (Java)
Line 83: | Line 83: | ||
== Classe externa deriva de classe interna == | == Classe externa deriva de classe interna == | ||
* | * Duas classes externas não directamente relacionadas entre si: <code>Carro</code> e <code>MotorEléctrico</code>. | ||
* Uma das classes externas (<code>MotorEléctrico</code>) deriva de uma classe interna (<code>Motor</code>). | |||
Note-se que a criação de instâncias da classe que deriva da classe interna só pode ser feita se algum dos seus construtores fornecer o contexto necessário à criação de instâncias da sua superclasse (i.e., é necessário um carro para se poder criar um motor). | |||
=== Carro === | |||
<B>public</B> <B>class</B> Carro { | |||
<B>protected</B> <B><FONT COLOR="#0095ff">String</FONT></B> _estado; | |||
<B>protected</B> Motor _motor; | |||
<B>abstract</B> <B>class</B> Motor { | |||
<FONT COLOR="#000080">Motor</FONT>(<B><FONT COLOR="#0095ff">String</FONT></B> estado) { | |||
_motor = <B>this</B>; | |||
_estado = estado; | |||
<B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">"Motor criado ("</FONT> + _estado + <FONT COLOR="#dd0000">")"</FONT>); | |||
} | |||
<FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">ligar</FONT>() { _estado = <FONT COLOR="#dd0000">"LIGADO"</FONT>; <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">"Motor "</FONT> + _estado); } | |||
<FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">desligar</FONT>() { _estado = <FONT COLOR="#dd0000">"DESLIGADO"</FONT>; <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">"Motor "</FONT> + _estado); } | |||
} | |||
<FONT COLOR="#000080">Carro</FONT>() { <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">"Carro criado"</FONT>); } | |||
<FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">andar</FONT>() { | |||
_motor.<FONT COLOR="#000080">ligar</FONT>(); | |||
<B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">"andar"</FONT>); | |||
_motor.<FONT COLOR="#000080">desligar</FONT>(); | |||
} | |||
} | |||
=== Motor Eléctrico === | |||
<B>public</B> <B>class</B> MotorEléctrico <B>extends</B> Carro.<FONT COLOR="#000080">Motor</FONT> { | |||
<B>private</B> <FONT COLOR="#000080">MotorEléctrico</FONT>(Carro c, <B><FONT COLOR="#0095ff">String</FONT></B> estado) { | |||
c.<FONT COLOR="#000080">super</FONT>(estado); | |||
<B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">"Carro eléctrico pré-criado"</FONT>); | |||
} | |||
<FONT COLOR="#000080">MotorEléctrico</FONT>(Carro c) { | |||
<B>this</B>(c, <FONT COLOR="#dd0000">"LIGADO"</FONT>); | |||
<B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">"Carro eléctrico criado"</FONT>); | |||
} | |||
<FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">ligar</FONT>() { | |||
<B>super</B>.<FONT COLOR="#000080">ligar</FONT>(); | |||
<FONT COLOR="#0095ff"><B>System</B></FONT>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">"Motor eléctrico ligado"</FONT>); | |||
} | |||
<FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">desligar</FONT>() { | |||
<B>super</B>.<FONT COLOR="#000080">desligar</FONT>(); | |||
<FONT COLOR="#0095ff"><B>System</B></FONT>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">"Motor eléctrico desligado"</FONT>); | |||
} | |||
} | |||
=== Teste === | |||
<B>public</B> <B>class</B> Teste8 { | |||
<B>public</B> <FONT COLOR="#800000">static</FONT> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">main</FONT>(<B><FONT COLOR="#0095ff">String</FONT></B>[] args) { | |||
Carro c = <B>new</B> <FONT COLOR="#000080">Carro</FONT>(); | |||
<B>new</B> <FONT COLOR="#000080">MotorEléctrico</FONT>(c); | |||
c.<FONT COLOR="#000080">andar</FONT>(); | |||
} | |||
} | |||
=== Resultados === | |||
<FONT COLOR="#993366"><B>$ java Teste8</B></FONT> | |||
Carro criado | |||
Motor criado (LIGADO) | |||
Carro eléctrico pré-criado | |||
Carro eléctrico criado | |||
Motor LIGADO | |||
Motor eléctrico ligado | |||
andar | |||
Motor DESLIGADO | |||
Motor eléctrico desligado | |||
<FONT COLOR="#993366"><B>$ ls</B></FONT> | |||
<B>Carro.java</B> Carro.class Carro$Motor.class | |||
<B>MotorEléctrico.java</B> MotorEléctrico.class | |||
<B>Teste8.java</B> Teste8.class | |||
== Especialização de classe interna == | == Especialização de classe interna == |
Revision as of 18:08, 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
- Duas classes externas não directamente relacionadas entre si:
Carro
eMotorEléctrico
. - Uma das classes externas (
MotorEléctrico
) deriva de uma classe interna (Motor
).
Note-se que a criação de instâncias da classe que deriva da classe interna só pode ser feita se algum dos seus construtores fornecer o contexto necessário à criação de instâncias da sua superclasse (i.e., é necessário um carro para se poder criar um motor).
Carro
public class Carro { protected String _estado; protected Motor _motor; abstract class Motor { Motor(String estado) { _motor = this; _estado = estado; System.out.println("Motor criado (" + _estado + ")"); } void ligar() { _estado = "LIGADO"; System.out.println("Motor " + _estado); } void desligar() { _estado = "DESLIGADO"; System.out.println("Motor " + _estado); } } Carro() { System.out.println("Carro criado"); } void andar() { _motor.ligar(); System.out.println("andar"); _motor.desligar(); } }
Motor Eléctrico
public class MotorEléctrico extends Carro.Motor { private MotorEléctrico(Carro c, String estado) { c.super(estado); System.out.println("Carro eléctrico pré-criado"); } MotorEléctrico(Carro c) { this(c, "LIGADO"); System.out.println("Carro eléctrico criado"); } void ligar() { super.ligar(); System.out.println("Motor eléctrico ligado"); } void desligar() { super.desligar(); System.out.println("Motor eléctrico desligado"); } }
Teste
public class Teste8 { public static void main(String[] args) { Carro c = new Carro(); new MotorEléctrico(c); c.andar(); } }
Resultados
$ java Teste8 Carro criado Motor criado (LIGADO) Carro eléctrico pré-criado Carro eléctrico criado Motor LIGADO Motor eléctrico ligado andar Motor DESLIGADO Motor eléctrico desligado
$ ls Carro.java Carro.class Carro$Motor.class MotorEléctrico.java MotorEléctrico.class Teste8.java Teste8.class
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