Classes Internas (Java)/Carros e Motores: Difference between revisions
From Wiki**3
Created page with "Os exemplos seguintes apresentam algumas possibilidades de extensão (herança) de classes internas e externas. * Carro & Motor (classes externas e internas) * [[Carro & Mot..." |
No edit summary |
||
| Line 1: | Line 1: | ||
Os exemplos seguintes apresentam algumas possibilidades de extensão (herança) de classes internas e externas. | 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 == | |||
<B>public</B> <B>class</B> Carro { | |||
<B>protected</B> <B><FONT COLOR="#0095ff">String</FONT></B> _estado; | |||
<B>abstract</B> <B>class</B> Motor { | |||
<B>abstract</B> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">ligar</FONT>(); | |||
<B>abstract</B> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">desligar</FONT>(); | |||
} | |||
<B>class</B> Motor0 { | |||
<FONT COLOR="#000080">Motor0</FONT>(<B><FONT COLOR="#0095ff">String</FONT></B> estado) { | |||
_estado = estado; | |||
<B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">"Motor0 criado ("</FONT> + _estado + <FONT COLOR="#dd0000">")"</FONT>); | |||
} | |||
} | |||
<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>() { <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">"andar"</FONT>); } | |||
} | |||
== Carro Eléctrico == | |||
<B>public</B> <B>class</B> CarroEléctrico <B>extends</B> Carro { | |||
<B>class</B> Motor <B>extends</B> Motor0 { | |||
<FONT COLOR="#000080">Motor</FONT>() { <B>super</B>(<FONT COLOR="#dd0000">"LIGADO"</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">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 criado"</FONT>); } | |||
<FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">andar</FONT>() { | |||
<B>super</B>.<FONT COLOR="#000080">andar</FONT>(); | |||
Motor m = <B>new</B> <FONT COLOR="#000080">Motor</FONT>(); | |||
m.<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 eléctrico"</FONT>); | |||
m.<FONT COLOR="#000080">desligar</FONT>(); | |||
} | |||
} | |||
== Teste == | |||
<B>public</B> <B>class</B> Teste7 { | |||
<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>(); | |||
c.<FONT COLOR="#000080">andar</FONT>(); | |||
Carro e = <B>new</B> <FONT COLOR="#000080">CarroEléctrico</FONT>(); | |||
e.<FONT COLOR="#000080">andar</FONT>(); | |||
} | |||
} | |||
== 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 = | |||
* [[Carro & Motor (classe externa deriva de classe interna)]] | * [[Carro & Motor (classe externa deriva de classe interna)]] | ||
= Especialização de classe interna = | |||
* [[Carro & Motor (overriding de classes internas)]] (problemas) | * [[Carro & Motor (overriding de classes internas)]] (problemas) | ||
[[Category:Ensino]] | [[Category:Ensino]] | ||
[[Category:PO]] | [[Category:PO]] | ||
Revision as of 18:04, 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:
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)