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

From Wiki**3

Root (talk | contribs)
Root (talk | contribs)
 
(18 intermediate revisions by the same user not shown)
Line 3: Line 3:


== Classes externas e internas ==
== Classes externas e internas ==
* Duas classes externas relacionadas entre si: <code>Carro</code> e <code>CarroEl&eacute;ctrico</code> (esta subclasse da primeira).
* 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.
* Duas classes internas relacionadas entre si, mas pertencendo cada uma a sua classe externa.


Line 10: Line 10:
=== Carro ===
=== Carro ===


  <B>public</B> <B>class</B> Carro {
<source lang="java">
    <B>protected</B> <B><FONT COLOR="#0095ff">String</FONT></B> _estado;
public class Carro {
 
  protected String _estado;
    <B>abstract</B> <B>class</B> Motor {
      <B>abstract</B> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">ligar</FONT>();
  abstract class Motor {
      <B>abstract</B> <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">desligar</FONT>();
    abstract void ligar();
    }
    abstract void desligar();
 
  }
    <B>class</B> Motor0 {
    <FONT COLOR="#000080">Motor0</FONT>(<B><FONT COLOR="#0095ff">String</FONT></B> estado) {
  class Motor0 {
        _estado = estado;
    Motor0(String estado) {
        <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;Motor0 criado (&quot;</FONT> + _estado + <FONT COLOR="#dd0000">&quot;)&quot;</FONT>);
      _estado = estado;
      }
      System.out.println("Motor0 criado (" + _estado + ")");
    }
    }
 
  }
    <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 criado&quot;</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">&quot;andar&quot;</FONT>);        }
  Carro()      { System.out.println("Carro criado"); }
  }
  void andar() { System.out.println("andar");        }
}
</source>


=== Carro El&eacute;ctrico ===
=== Carro El&eacute;ctrico ===


  <B>public</B> <B>class</B> CarroEl&eacute;ctrico <B>extends</B> Carro {
<source lang="java">
 
public class CarroEléctrico extends Carro {
    <B>class</B> Motor <B>extends</B> Motor0 {
      <FONT COLOR="#000080">Motor</FONT>() { <B>super</B>(<FONT COLOR="#dd0000">&quot;LIGADO&quot;</FONT>); }
  class Motor extends Motor0 {
      <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">ligar</FONT>()    { _estado = <FONT COLOR="#dd0000">&quot;LIGADO&quot;</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> + _estado); }
    Motor() { super("LIGADO"); }
      <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">desligar</FONT>() { _estado = <FONT COLOR="#dd0000">&quot;DESLIGADO&quot;</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> + _estado); }
    void ligar()    { _estado = "LIGADO";    System.out.println("Motor " + _estado); }
    }
    void desligar() { _estado = "DESLIGADO"; System.out.println("Motor " + _estado); }
 
  }
    <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 criado&quot;</FONT>); }
 
  CarroEléctrico() { System.out.println("Carro eléctrico criado"); }
    <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">andar</FONT>() {
      <B>super</B>.<FONT COLOR="#000080">andar</FONT>();
  void andar() {
      Motor m = <B>new</B> <FONT COLOR="#000080">Motor</FONT>();
    super.andar();
      m.<FONT COLOR="#000080">ligar</FONT>();
    Motor m = new Motor();
      <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;andar el&eacute;ctrico&quot;</FONT>);
    m.ligar();
      m.<FONT COLOR="#000080">desligar</FONT>();
    System.out.println("andar eléctrico");
    }
    m.desligar();
 
  }
  }
}
</source>


=== Teste ===
=== Teste ===


  <B>public</B> <B>class</B> Teste7 {
<source lang="java">
    <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) {
public class Teste7 {
 
  public static void main(String[] args) {
      Carro c = <B>new</B> <FONT COLOR="#000080">Carro</FONT>();
      c.<FONT COLOR="#000080">andar</FONT>();
    Carro c = new Carro();
 
    c.andar();
      Carro e = <B>new</B> <FONT COLOR="#000080">CarroEl&eacute;ctrico</FONT>();
      e.<FONT COLOR="#000080">andar</FONT>();
    Carro e = new CarroEléctrico();
    }
    e.andar();
  }
  }
}
</source>


=== Resultados ===
=== Resultados ===
Line 83: Line 89:


== Classe externa deriva de classe interna ==
== Classe externa deriva de classe interna ==
* Duas classes externas não directamente relacionadas entre si: <code>Carro</code> e <code>MotorEl&eacute;ctrico</code>.
* Duas classes externas não directamente relacionadas entre si: '''Carro''' e '''MotorEléctrico'''.
* Uma das classes externas (<code>MotorEl&eacute;ctrico</code>) deriva de uma classe interna (<code>Motor</code>).
* 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).
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 ===
=== Carro ===


  <B>public</B> <B>class</B> Carro {
<source lang="java">
    <B>protected</B> <B><FONT COLOR="#0095ff">String</FONT></B> _estado;
public class Carro {
    <B>protected</B> Motor  _motor;
  protected String _estado;
 
  protected Motor  _motor;
    <B>abstract</B> <B>class</B> Motor {
      <FONT COLOR="#000080">Motor</FONT>(<B><FONT COLOR="#0095ff">String</FONT></B> estado) {
  abstract class Motor {
        _motor  = <B>this</B>;
    Motor(String estado) {
        _estado = estado;
      _motor  = this;
        <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;Motor criado (&quot;</FONT> + _estado + <FONT COLOR="#dd0000">&quot;)&quot;</FONT>);
      _estado = estado;
      }
      System.out.println("Motor criado (" + _estado + ")");
      <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">ligar</FONT>()    { _estado = <FONT COLOR="#dd0000">&quot;LIGADO&quot;</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> + _estado); }
    }
      <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">desligar</FONT>() { _estado = <FONT COLOR="#dd0000">&quot;DESLIGADO&quot;</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> + _estado); }
    void ligar()    { _estado = "LIGADO";    System.out.println("Motor " + _estado); }
    }
    void desligar() { _estado = "DESLIGADO"; System.out.println("Motor " + _estado); }
 
  }
    <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 criado&quot;</FONT>); }
 
  Carro() { System.out.println("Carro criado"); }
    <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">andar</FONT>() {
      _motor.<FONT COLOR="#000080">ligar</FONT>();
  void andar() {
      <B><FONT COLOR="#0095ff">System</FONT></B>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;andar&quot;</FONT>);
    _motor.ligar();
      _motor.<FONT COLOR="#000080">desligar</FONT>();
    System.out.println("andar");
    }
    _motor.desligar();
  }
  }
}
</source>


=== Motor Eléctrico ===
=== Motor Eléctrico ===


  <B>public</B> <B>class</B> MotorEl&eacute;ctrico <B>extends</B> Carro.<FONT COLOR="#000080">Motor</FONT> {
<source lang="java">
 
public class MotorEléctrico extends Carro.Motor {
    <B>private</B> <FONT COLOR="#000080">MotorEl&eacute;ctrico</FONT>(Carro c, <B><FONT COLOR="#0095ff">String</FONT></B> estado) {
      c.<FONT COLOR="#000080">super</FONT>(estado);
  private MotorEléctrico(Carro c, String estado) {
      <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 pr&eacute;-criado&quot;</FONT>);
    c.super(estado);
    }
    System.out.println("Carro eléctrico pré-criado");
 
  }
    <FONT COLOR="#000080">MotorEl&eacute;ctrico</FONT>(Carro c) {
      <B>this</B>(c, <FONT COLOR="#dd0000">&quot;LIGADO&quot;</FONT>);
  MotorEléctrico(Carro c) {
      <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 criado&quot;</FONT>);
    this(c, "LIGADO");
    }
    System.out.println("Carro eléctrico criado");
 
  }
    <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">ligar</FONT>() {
      <B>super</B>.<FONT COLOR="#000080">ligar</FONT>();
  void ligar() {
      <FONT COLOR="#0095ff"><B>System</B></FONT>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;Motor el&eacute;ctrico ligado&quot;</FONT>);
    super.ligar();
    }
    System.out.println("Motor eléctrico ligado");
 
  }
    <FONT COLOR="#800000">void</FONT> <FONT COLOR="#000080">desligar</FONT>() {
      <B>super</B>.<FONT COLOR="#000080">desligar</FONT>();
  void desligar() {
      <FONT COLOR="#0095ff"><B>System</B></FONT>.<FONT COLOR="#000080">out</FONT>.<FONT COLOR="#000080">println</FONT>(<FONT COLOR="#dd0000">&quot;Motor el&eacute;ctrico desligado&quot;</FONT>);
    super.desligar();
    }
    System.out.println("Motor eléctrico desligado");
 
  }
  }
}
</source>


=== Teste ===
=== Teste ===


  <B>public</B> <B>class</B> Teste8 {
<source lang="java">
    <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) {
public class Teste8 {
      Carro c = <B>new</B> <FONT COLOR="#000080">Carro</FONT>();
  public static void main(String[] args) {
      <B>new</B> <FONT COLOR="#000080">MotorEl&eacute;ctrico</FONT>(c);
    Carro c = new Carro();
      c.<FONT COLOR="#000080">andar</FONT>();
    new MotorEléctrico(c);
    }
    c.andar();
  }
  }
}
</source>


=== Resultados ===
=== Resultados ===
Line 175: Line 187:
=== Carro ===
=== Carro ===


  <B>public</B> <B>class</B> Carro {
<source lang="java">
 
public class 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>); }
  protected class Motor {
    }
    Motor() { System.out.println("Motor"); }
 
  }
    <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>);
  public Carro() {
      Motor m = <B>new</B> <FONT COLOR="#000080">Motor</FONT>();
    System.out.println("Carro");
    }
    Motor m = new Motor();
  }
  }
}
</source>


=== Carro Eléctrico ===
=== Carro Eléctrico ===


  <B>public</B> <B>class</B> CarroEl&eacute;ctrico <B>extends</B> Carro {
<source lang="java">
 
public class CarroEléctrico extends 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>); }
  protected class Motor extends Carro.Motor {
    }
    Motor() { System.out.println("Motor eléctrico"); }
 
  }
    <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>);
  public CarroEléctrico() {
      Motor m = <B>new</B> <FONT COLOR="#000080">Motor</FONT>();
    System.out.println("Carro eléctrico");
    }
    Motor m = new Motor();
  }
  }
}
</source>


=== Teste ===
=== Teste ===


<java5>
<source lang="java">
public class Teste9 {
public class Teste9 {
   public static void main(String[] args) {
   public static void main(String[] args) {
Line 209: Line 225:
   }
   }
  }
  }
</java5>
</source>


=== Resultados ===
=== Resultados ===

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