|
|
(4 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
| {{TOCright}}
| | #REDIRECT [[ist:Classes Internas (Java)/Carros e Motores]] |
| 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: <code>Carro</code> e <code>CarroEléctrico</code> (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 ===
| |
| | |
| <java5>
| |
| 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"); }
| |
| }
| |
| </java5>
| |
| | |
| === Carro Eléctrico ===
| |
| | |
| <java5>
| |
| 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();
| |
| }
| |
|
| |
| }
| |
| </java5>
| |
| | |
| === Teste ===
| |
| | |
| <java5>
| |
| public class Teste7 {
| |
| public static void main(String[] args) {
| |
|
| |
| Carro c = new Carro();
| |
| c.andar();
| |
|
| |
| Carro e = new CarroEléctrico();
| |
| e.andar();
| |
| }
| |
| }
| |
| </java5>
| |
| | |
| === Resultados ===
| |
| | |
| <FONT COLOR="#993366"><B>$ java Teste7</B></FONT>
| |
| Carro criado
| |
| andar
| |
| Carro criado
| |
| Carro eléctrico criado
| |
| andar
| |
| Motor0 criado (LIGADO)
| |
| Motor LIGADO
| |
| andar eléctrico
| |
| MotorDESLIGADO
| |
| | |
| <FONT COLOR="#993366"><B>$ ls</B></FONT>
| |
| <B>Carro.java</B> Carro.class Carro$Motor.class Carro$Motor0.class
| |
| <B>CarroEléctrico.java</B> CarroEléctrico.class CarroEléctrico$Motor.class
| |
| <B>Teste7.java</B> Teste7.class
| |
| | |
| == 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 ===
| |
| | |
| <java5>
| |
| 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();
| |
| }
| |
| }
| |
| </java5>
| |
| | |
| === Motor Eléctrico ===
| |
| | |
| <java5>
| |
| 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");
| |
| }
| |
|
| |
| }
| |
| </java5>
| |
| | |
| === 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 ==
| |
| | |
| 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 ===
| |
| | |
| <java5>
| |
| public class Carro {
| |
|
| |
| protected class Motor {
| |
| Motor() { System.out.println("Motor"); }
| |
| }
| |
|
| |
| public Carro() {
| |
| System.out.println("Carro");
| |
| Motor m = new Motor();
| |
| }
| |
| }
| |
| </java5>
| |
| | |
| === Carro Eléctrico ===
| |
| | |
| <B>public</B> <B>class</B> CarroEléctrico <B>extends</B> Carro {
| |
|
| |
| <B>protected</B> <B>class</B> Motor <B>extends</B> Carro.<FONT COLOR="#000080">Motor</FONT> {
| |
| <FONT COLOR="#000080">Motor</FONT>() { <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">"Motor eléctrico"</FONT>); }
| |
| }
| |
|
| |
| <B>public</B> <FONT COLOR="#000080">CarroEléctrico</FONT>() {
| |
| <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">"Carro eléctrico"</FONT>);
| |
| Motor m = <B>new</B> <FONT COLOR="#000080">Motor</FONT>();
| |
| }
| |
| }
| |
| | |
| === Teste ===
| |
| | |
| <java5>
| |
| public class Teste9 {
| |
| public static void main(String[] args) {
| |
| new CarroEléctrico();
| |
| }
| |
| }
| |
| </java5>
| |
| | |
| === Resultados ===
| |
| | |
| <FONT COLOR="#993366"><B>$ java Teste9</B></FONT>
| |
| Carro
| |
| Motor
| |
| Carro eléctrico
| |
| Motor
| |
| Motor eléctrico
| |
| | |
| <FONT COLOR="#993366"><B>$ ls</B></FONT>
| |
| '''Carro.java''' Carro.class Carro$Motor.class
| |
| '''CarroEléctrico.java''' CarroEléctrico.class CarroEléctrico$Motor.class
| |
| '''Teste9.java''' Teste9.class
| |
| | |
| | |
| [[Category:Ensino]]
| |
| [[Category:PO]]
| |