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..." |
|||
| (29 intermediate revisions by the same user not shown) | |||
| Line 1: | Line 1: | ||
{{TOCright}} | |||
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: '''Carro''' e '''CarroElé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 === | |||
<source lang="java"> | |||
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"); } | |||
} | |||
</source> | |||
=== Carro Eléctrico === | |||
<source lang="java"> | |||
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(); | |||
} | |||
} | |||
</source> | |||
=== Teste === | |||
<source lang="java"> | |||
public class Teste7 { | |||
public static void main(String[] args) { | |||
Carro c = new Carro(); | |||
c.andar(); | |||
Carro e = new CarroEléctrico(); | |||
e.andar(); | |||
} | |||
} | |||
</source> | |||
=== 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: '''Carro''' e '''MotorEléctrico'''. | |||
* A classes externa '''MotorEléctrico''' deriva da 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 === | |||
<source lang="java"> | |||
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(); | |||
} | |||
} | |||
</source> | |||
=== Motor Eléctrico === | |||
<source lang="java"> | |||
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"); | |||
} | |||
} | |||
</source> | |||
=== Teste === | |||
<source lang="java"> | |||
public class Teste8 { | |||
public static void main(String[] args) { | |||
Carro c = new Carro(); | |||
new MotorEléctrico(c); | |||
c.andar(); | |||
} | |||
} | |||
</source> | |||
=== 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 === | |||
<source lang="java"> | |||
public class Carro { | |||
protected class Motor { | |||
Motor() { System.out.println("Motor"); } | |||
} | |||
public Carro() { | |||
System.out.println("Carro"); | |||
Motor m = new Motor(); | |||
} | |||
} | |||
</source> | |||
=== Carro Eléctrico === | |||
<source lang="java"> | |||
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(); | |||
} | |||
} | |||
</source> | |||
=== Teste === | |||
<source lang="java"> | |||
public class Teste9 { | |||
public static void main(String[] args) { | |||
new CarroEléctrico(); | |||
} | |||
} | |||
</source> | |||
=== 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:Ensino]] | ||
[[Category:PO]] | [[Category:PO]] | ||
Latest revision as of 17:33, 23 September 2021
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 e CarroElé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 e MotorEléctrico.
- A classes externa MotorEléctrico deriva da 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