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

From Wiki**3

< Classes Internas (Java)
No edit summary
Line 87: Line 87:
= Especialização de classe interna =
= Especialização de classe interna =


* [[Carro & Motor (overriding de classes internas)]] (problemas)
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 ===
 
  <B>public</B> <B>class</B> Carro {
 
    <B>protected</B> <B>class</B> Motor {
      <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">&quot;Motor&quot;</FONT>); }
    }
 
    <B>public</B> <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">&quot;Carro&quot;</FONT>);
      Motor m = <B>new</B> <FONT COLOR="#000080">Motor</FONT>();
    }
  }
 
=== Carro Eléctrico ===
 
  <B>public</B> <B>class</B> CarroEl&eacute;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">&quot;Motor el&eacute;ctrico&quot;</FONT>); }
    }
 
    <B>public</B> <FONT COLOR="#000080">CarroEl&eacute;ctrico</FONT>() {
      <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;Carro el&eacute;ctrico&quot;</FONT>);
      Motor m = <B>new</B> <FONT COLOR="#000080">Motor</FONT>();
    }
  }
 
=== Teste ===
 
  <B>public</B> <B>class</B> Teste9 {
    <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) {
      <B>new</B> <FONT COLOR="#000080">CarroEl&eacute;ctrico</FONT>();
    }
  }
 
=== 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:Ensino]]
[[Category:PO]]
[[Category:PO]]

Revision as of 18:06, 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 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

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