Download as pdf or txt
Download as pdf or txt
You are on page 1of 9

Objektovo orientovan programovanie

(vnoren typy) 5. prednka

Vladislav Novk FEI STU v Bratislave 18.10.2013

OOP 2013

Vnoren typy

UIM FEI STU v Bratislave

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

UIM FEI STU v Bratislave

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

UIM FEI STU v Bratislave

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

UIM FEI STU v Bratislave

Prklad pouitia vntornej triedy


public class PoleDouble { private double[] udaje; public PoleDouble(double ... vstup) { udaje = new double[vstup.length]; for (int i = 0; i < udaje.length; i++) { udaje[i] = vstup[i]; } } private boolean jePlatny(int index) { return index >= 0 && index < udaje.length; } public double dajHodnotu(int index) { return jePlatny(index) ? udaje[index] : 0; } public void nastav(int index, double hodnota) { if( jePlatny(index)) { udaje[index] = hodnota; } } public double dajDlzku() { return udaje.length; } public Iterator dajIterator() { return this.new Iterator(); } public class Iterator { private int index; //index pred dalsi prvok public Iterator() { index = -1; } public boolean existujeDalsiPrvok() { return index + 1 < udaje.length; } //posunie sa na dalsi prvok a vrati jeho hodnotu public double dajDalsiPrvok() { index++; return udaje[index]; } } }

OOP 2013

Vnoren typy

UIM FEI STU v Bratislave

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

UIM FEI STU v Bratislave

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

UIM FEI STU v Bratislave

Vnoren rozhrania prklad:


public class PoleDouble { private double[] udaje; public PoleDouble(double ... vstup) { udaje = new double[vstup.length]; for (int i = 0; i < udaje.length; i++) { udaje[i] = vstup[i]; } } @Override public String toString() { return Arrays.toString(udaje); } private interface Funkcia { double vykonaj(double prvok, double argument); } private void vykonajCyklus(double argument, Funkcia funkcia) { for(int i = 0; i < udaje.length; i ++) { udaje[i] = funkcia.vykonaj(udaje[i], argument); } } public void pripocitajKuVsetkymPrvkom(double scitanec) { //for(int i = 0; i < udaje.length; i++) { // udaje[i] += scitanec; //} vykonajCyklus(scitanec, new Funkcia() { @Override public double vykonaj(double prvok, double argument) { return prvok + argument; } }); } public void vynasomKazkyPrvok(double nasobitel) { //for(int i = 0; i < udaje.length; i++) { // udaje[i] *= nasobitel; //} vykonajCyklus(nasobitel, new Funkcia() { @Override public double vykonaj(double prvok, double argument) { return prvok * argument; } }); } }

OOP 2013

Vnoren typy

UIM FEI STU v Bratislave

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]

You might also like