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.
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.
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.
Cv11.1
© Ivan Kupka
Vaše komentáre:
kupka@fmph.uniba.sk