Classes Internas (Java)/Carros e Motores: Difference between revisions

From Wiki**3

< Classes Internas (Java)
 
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: '''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&atilde;o h&aacute; qualquer problema em reutilizar nomes de classes internas em m&uacute;ltiplas classes externas, uma vez que a sua identifica&ccedil;&atilde;o se faz de forma relativa ao contexto em que s&atilde;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&eacute;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&eacute;ctrico criado
  andar
  Motor0 criado (LIGADO)
  Motor LIGADO
  andar el&eacute;ctrico
  MotorDESLIGADO
 
  <FONT COLOR="#993366"><B>$ ls</B></FONT>
  <B>Carro.java</B> Carro.class Carro$Motor.class Carro$Motor0.class
  <B>CarroEl&eacute;ctrico.java</B> CarroEl&eacute;ctrico.class CarroEl&eacute;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 ===
 
<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 ===
 
<java5>
public class Teste8 {
  public static void main(String[] args) {
    Carro c = new Carro();
    new MotorEléctrico(c);
    c.andar();
  }
}
</java5>
 
=== Resultados ===
 
  <FONT COLOR="#993366"><B>$ java Teste8</B></FONT>
  Carro criado
  Motor criado (LIGADO)
  Carro el&eacute;ctrico pr&eacute;-criado
  Carro el&eacute;ctrico criado
  Motor LIGADO
  Motor el&eacute;ctrico ligado
  andar
  Motor DESLIGADO
  Motor el&eacute;ctrico desligado
 
  <FONT COLOR="#993366"><B>$ ls</B></FONT>
  <B>Carro.java</B> Carro.class Carro$Motor.class
  <B>MotorEl&eacute;ctrico.java</B> MotorEl&eacute;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 ===
 
<java5>
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();
  }
}
</java5>
 
=== 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&eacute;ctrico
  Motor
  Motor el&eacute;ctrico
 
  <FONT COLOR="#993366"><B>$ ls</B></FONT>
  '''Carro.java''' Carro.class Carro$Motor.class
  '''CarroEl&eacute;ctrico.java''' CarroEl&eacute;ctrico.class CarroEl&eacute;ctrico$Motor.class
  '''Teste9.java''' Teste9.class
 
 
[[Category:Ensino]]
[[Category:PO]]

Latest revision as of 14:18, 7 November 2018