Professional Documents
Culture Documents
Prednaska05 Vnorenetypy
Prednaska05 Vnorenetypy
OOP 2013
Vnoren typy
Obsah Vnoren triedy ............................................................................................................................ 1 Modifiktory............................................................................................................................... 1 Statick vnoren trieda (static nested class) ............................................................................... 2 Vntorn trieda (inner [non-static] class)................................................................................... 2 Referencia this na intanciu vonkajiu triedy z vntornej triedy ........................................... 2 Prklad pouitia vntornej triedy ................................................................................................ 3 Loklne a anonymn vntorn triedy ......................................................................................... 5 Vnoren rozhrania ...................................................................................................................... 6
OOP 2013
Vnoren typy
Vnoren triedy Vnoren trieda (nested class) trieda definovan v rmci inej triedy.
class VonkajsiaTrieda { class VnorenaTrieda { //..... } // ..... }
Vnoren trieda je lenom triedy v ktorej je umiestnen. Preto m prstup ku vetkm lenom vonkajej triedy aj ke s oznaen ako private. Modifiktory Vnoren triedu mono oznai jednm z modifiktorov: public, protected, private, alebo necha bez tchto modifiktorov (package private). Platia rovnak pravidl ako pre lensk premenn a metdy. Vnoren triedy sa delia do dvoch kategrii: - statick vnoren triedy (deklarovan so slovom static) - vntorn triedy (inner class) = nestatick vnoren triedy
public class VonkajsiaTrieda { private String instancna = "premenna instancie"; private static String staticka = "premenna triedy"; class VnutornaTrieda { VnutornaTrieda() { System.out.println(instancna); System.out.println(staticka); } } static class StatickaVnorenaTrieda StatickaVnorenaTrieda() { System.out.println(staticka); } } {
public static void main(String[] args) { VonkajsiaTrieda vonkajsiObjekt = new VonkajsiaTrieda(); VonkajsiaTrieda.VnutornaTrieda vnutornyObjekt = vonkajsiObjekt.new VnutornaTrieda(); VonkajsiaTrieda.StatickaVnorenaTrieda statickaVnorena = new VonkajsiaTrieda.StatickaVnorenaTrieda(); } }
OOP 2013
Vnoren typy
Pouitie: - Logick zoskupenie tried: Ak je niektor trieda uiton iba pre jednu triedu, me by vhodn ju vloi do prslunej triedy - Lepie zapuzdrenie: ak jedna trieda pristupuje k lenom inej triedy ktor by mali by private, meme ju vloi ako vntorn. - Me zlepova itatenos a udrovatenos kdu asto sa vyuva pri tvorbe GUI Statick vnoren trieda (static nested class) Statick vnoren trieda neme priamo pristupova ku lenom intancie vonkajej triedy (ku lenom triedy (statick leny) me pristupova). Prstup: VonkajsiaTrieda.StatickaVnutornaTrieda Vytvorenie intancie statickej vnorenej triedy: VonkajsiaTrieda.StatickaVnorenaTrieda vnorenyObjekt = new VonkajsiaTrieda.StatickaVnorenaTrieda(); Vntorn trieda (inner [non-static] class) Je pridruen k intancii vonkajej triedy. M prstup k lenskm premennm a metdam danej intancie. Vntorn trieda neme obsahova statick leny. Pred vytvorenm intancie vntornej triedy mus by vytvoren intancia vonkajej triedy. Vytvorenie intancie vntornej triedy: VonkajsiaTrieda.VntornTrieda vnutornyObjekt = vonkajsiObjekt.new VnutornaTrieda();
Referencia this na intanciu vonkajiu triedy z vntornej triedy Niekedy je potrebn v kde vntornej triedy zska referenciu na intanciu vonkajej triedy. Kovm slovom this vo vntornej triede zskame referenciu na intanciu vntornej triedy. Ak potrebujeme zska this intancie vonkajej triedy, je potrebn pred this napsa nzov vonkajej triedy. prklad:
public class VonkajsiaTrieda { private int atribut; private class VnutornaTrieda { private int atribut; public void metoda() { this.atribut = 10; //atribt intancie vnutornej triedy VonkajsiaTrieda.this.atribut = 20; //atribt intancie //vonkajej triedy } } }
OOP 2013
Vnoren typy
OOP 2013
Vnoren typy
public static void main(String[] args) { PoleDouble pole = new PoleDouble(1,2,3,4,5); //itertor svis s intanciou pola, //meme vytvori viacero itertorov svisiacich s jednou //intanciou pola PoleDouble.Iterator iterator = pole.dajIterator(); while( iterator.existujeDalsiPrvok()) { System.out.println(iterator.dajDalsiPrvok()); } }
vstup:
1.0 2.0 3.0 4.0 5.0
OOP 2013
Vnoren typy
Loklne a anonymn vntorn triedy Existuj dva pecilne typy vnorench tried. Mono ich deklarova v rmci tela metdy: - loklne vntorn triedy (local class) trieda deklarovan v rmci tela metdy - anonymn vntorn triedy (anonymous class) trieda deklarovan v rmci tela metdy, ale nie je pomenovan prklad: sbor Uloha.java:
public interface Uloha { void pocitaj(); }
sbor Spustac.java:
public class Spustac { private Uloha uloha; public void nastav(Uloha novaUloha ) { uloha = novaUloha; } public void spusti() { if( uloha != null ) { uloha.pocitaj(); } } }
sbor PrikladPreLokalnuAAnonymnuTriedu.java:
public class PrikladPreLokalnuAAnonimnuTriedu { public static void main(String[] args) { //lokalna trieda class Uloha1 implements Uloha{ public void pocitaj() { System.out.println("lokalna trieda"); } } Spustac spustac1 = new Spustac(); spustac1.nastav(new Uloha1()); //anonymna trieda Spustac spustac2 = new Spustac(); spustac2.nastav(new Uloha() { public void pocitaj() { System.out.println("anonymna trieda"); } }); //niekde dalej: spustac1.spusti(); spustac2.spusti(); } }
Pri vytvran anonymnej triedy uvdzame nzov triedy od ktorej bude anonymn trieda dedi, alebo nzov rozhrania, ktor bude anonymn trieda implementova.
OOP 2013
Vnoren typy
OOP 2013
Vnoren typy
public static void main(String[] args) { PoleDouble pole = new PoleDouble(1,2,3,4,5); System.out.println(pole); // [1.0, 2.0, 3.0, 4.0, 5.0] pole.pripocitajKuVsetkymPrvkom(2); System.out.println(pole); // [3.0, 4.0, 5.0, 6.0, 7.0] pole.vynasomKazkyPrvok(10); System.out.println(pole); // [30.0, 40.0, 50.0, 60.0, 70.0] }
vstup:
[1.0, 2.0, 3.0, 4.0, 5.0] [3.0, 4.0, 5.0, 6.0, 7.0] [30.0, 40.0, 50.0, 60.0, 70.0]