autor: Ivan Kupka

Verzia 1

home uvod K1 K2 K3 K4 K5 K6 K7 K8 K9 K10 K11 K12 K13 K14

 

Java 11

 

 Vnorené triedy

 Cieľom tejto pasáže je podať veľmi stručnú informáciu o vnorených triedach a ukázať, na aké účely nám tieto triedy  môžu slúžiť.

 

  V jazyku Java možno definovať triedu aj vnútri inej triedy. Takáto trieda sa nazýva vnorená. Použitie vnorených tried uvidíme v javovských programoch hádam najlepšie pri appletoch, poprípade iných kódoch, definujúcich grafické rozhranie. Vnorená trieda má jednu dôležitú vlastnosť: má prístup ku všetkým metódam a premenným svojej uzavieracej triedy. Teda aj k tým, označeným ako „private“.  (Uzavieracia trieda k metódam a premenným vnorenej triedy priamy prístup nemá.)

  My si tu ukážeme použitie nestatických vnútorných tried. Tieto triedy sa nazývajú vnútornými triedami.

  V kóde P11.1 vidíme jednu možnosť využitia vnútorných tried. V programe potrebujeme implementovať rozhranie Informuj. Táto implementácia má  slúžiť len a len na účely triedy HlavnyStab. Pre iné triedy je nezaujímavá. Navyše je pomerne jednoduchá. To sú už prvé dôvody, prečo uvažovať o implementácii rozhrania Informuj za pomoci vnútornej triedy. Trieda HlavnyStab navyše potrebuje podávať informáciu dvojakým spôsobom: jednak chce rozhranie Informuj použiť na vytvorenie vnútornej informácie („v rámci armády“), jednak na vytvorenie kamufláže, „informácie“ pre nepriateľské vojsko.  Keby trieda HlavnyStab  inplementovala rozhranie Informuj sama, mohla by jeho metódu „info()“ definovať iba jedným spôsobom. 

  Riešenie dilemy: použijeme dve vnútorné triedy. Každá implementuje rozhranie Informuj svojím spôsobom.

 

 

Kód P11.1

interface Informuj{

       public void info();

}

 

public class  HlavnyStab {

      boolean zautocimeZmora = false;

      String more=" Zautocia z mora.";

      String zem  = " Zautocia zo zeme.";

      // instancie vnutornych tried:

      VnutorneInfo depesa = new VnutorneInfo();

      InformujNepriatela agent = new InformujNepriatela();

      //inicializacny blok nahodne nastavi premennu "zautocimeZmora"

       {

         double d = Math.random();

         if(d >0.5) zautocimeZmora = true;

         }

 

           // prva vnutorna trieda – informuje pravdivo svoje vojsko

        class VnutorneInfo implements Informuj{

                  public void info(){

               System.out.println("Tajna sprava: Zautocime z mora = " + zautocimeZmora +".");

            }  

          }

      

              //druha vnutorna trieda – nepravdive „info“ pre nepriatela

          class InformujNepriatela implements Informuj{

                  public void info(){

                        String sa = "Sprava agenta 008: ";

                        if(zautocimeZmora) sa+= zem;

                        else sa+= more;

                     System.out.println(sa);

                   }

              }

 

     public static void main(String[] args)       {

                       

              HlavnyStab stab = new HlavnyStab();

              stab.depesa.info();

              stab.agent.info();

       }//EOMain

  }//EOClass

 

 Jeden z výstupov:

 

Tajna sprava: Zautocime z mora = true.

 

Sprava agenta 008:  Zautocia zo zeme.

 

  Ukážme si použitie vnútornej triedy ešte na jednom príklade. Nasledujúci kód definuje okno-rám, ktorý jednoduchým spôsobom reaguje na pohyb myšou.

Keď program spustíme, objaví sa prázdny rám. Trieda, ktorú definujeme, obsahuje  vo svojom poli nielen rám, ale aj objekt „ucho“. Objekt je  inštanciou  vnútornej triedy PosluchacRamu, ktorá implemenuje rozhranie „MouseMotionListener“. Táto inštancia „vie“ o tom, čo sa deje s rámom.  Vie, keď ponad rám prechádzame myšou. A vie, aj o tom, keď ňou  ťaháme. Takisto vie ovplyvniť chovanie rámu.

Skúste si to: Spustite program. Prejdite myšou ponad rám. Rám sa zmenší (pracuje metóda MouseMoved()). Potom prejdite ponad rám s myšou tak, že ľavé alebo pravé tlačítko na myši je stlačené. Rám zmení veľkosť a náhodne zmení farbu.

 

Kód P11.2

      

       import javax.swing.*;

       import java.awt.*;

        import java.awt.event.*;

      

       public class RamSPosluchacom {

           //definuje ram

         JFrame ram = new JFrame();

            // definuje prvok vnutornej triedy

         PosluchacRamu ucho = new PosluchacRamu();

        

             // yabeypeci yobrayenie ramu

         public void zobrazRam(int i){

                ram.setSize(i,i);

                ram.addMouseMotionListener(ucho);

                ram.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

                ram.setVisible(true);

      }        

          // vnutorna trieda:

          class PosluchacRamu implements MouseMotionListener {

     

      //tahanie mysou zmeni velkost ramu a tiez farbu pozadia

      public void mouseDragged(MouseEvent e){                 

                    ram.setSize(400,80);

                    Container cp = ram.getContentPane();

              int red =(int)(Math.random()*255);

               int green =(int)(Math.random()*255);

               int blue = (int)(Math.random()*255);

               Color farbaPozadia = new Color(red,green,blue);

         cp.setBackground(farbaPozadia);

                }

                  

                    //pohyb mysou nad ramom sposobi jeho zmensenie       

                   public void mouseMoved(MouseEvent e){           

                          ram.setSize(50,200);

                   }

           }

        

          public static void main(String[] args){

        

                RamSPosluchacom rsp = new RamSPosluchacom();

            rsp.zobrazRam(400);

           }//EOMain

        }//EOClass

 

Komentáre: Nemusíte rozumieť všetkým príkazom. Stačí, keď uvidíte program v činnosti.

Riadok   „ram.addMouseMotionListener(ucho);“ v metóde „zobrazRam(...)“

zabezpečil, že náš rám posiela správy o pohybe myši práve objektu „ucho“. Tento správy spracuje a ovplyvní naspäť stav rámu.

 

Cvičenia

Cv11.1

 

Presvedčte sa, že vnorenia tried môžu byť mnohonásobné. Vytvorte svoju vlastnú triedu s vnútornou triedou. Táto vnútorná trieda nech obsahuje ďalšiu vnútornú triedu.

 

© Ivan Kupka

 

home uvod K1 K2 K3 K4 K5 K6 K7 K8 K9 K10 K11 K12 K13 K14

Vaše komentáre: kupka@fmph.uniba.sk