1 / 10

Metódy statické

Metódy statické. Blaise Pascal (1623-1662) chce počítať v Jave sínusy. Pokus č. 1:. The method sin() is undefined / Met óda sin() nie je v tejto triede definovaná. public static void main(String[] args) { double sinus = sin( 25 ); }.

ankti
Download Presentation

Metódy statické

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Metódy statické • Blaise Pascal (1623-1662) chce počítať v Jave sínusy. • Pokus č. 1: The method sin() is undefined / Metóda sin() nie je v tejto triede definovaná public static void main(String[] args) { double sinus = sin(25); } • Spomnime: žiadne voľne poletujúce procedúry/funkcie • Pokus č. 2: ,,Aha, trieda java.lang.Math má metódu sin()!" public static void main(String[] args) { Math m = new Math(); double sinus = m.sin(25); } PAZ1c

  2. Metódy statické • ,,To mám akože kvôli [píííííp] sínusu písať toľko riadkov?" public static void main(String[] args) { double sinus = new Math().sin(25); } vytvorím inštanciu, zavolám metódu • Riešenie: • Všimnime si hlavičku metódy sin() public static double sin(double a) • Statické metódy (alias static methods alias metódy triedy alias class methods) nepotrebujú inštanciu triedy. metódu volám na triede, nie na inštancii! public static void main(String[] args) { double sinus = Math.sin(25); } PAZ1c

  3. Inštančné premenné statické • Aj inštančné premenné môžu byť statické porušili sme zásadu o getteroch a setteroch public class Pes { staticString typ; } • Načo je to dobré? • Hodnota statickej premennej je rovnaká pre všetky objekty. Typ nastavujeme všetkým psom sveta. public static void main(String[] args) { Pes dunčo = new Pes(); dunčo.typ = "štekajúci"; System.out.println(dunčo.typ); Pes lajka = new Pes(); System.out.println(lajka.typ); } štekajúci štekajúci PAZ1c

  4. Inštančné premenné statické analógia: Pes = unit typ = globálna premenná public class Pes { staticString typ; } • analógia 1 (z procedurálnych jazykov): • Pes je unit, typ je globálna premenná v unite • analógia 2 (od Freuda) • všetky psy majú kolektívnu pamäť • typ si zdieľajú medzi sebou • Ak typ zmeníme na jednom mieste a potom na druhom mieste, zmena sa opäť prejaví na všetkých psoch. PAZ1c

  5. Inštančné premenné statické analógia: Pes = unit typ = globálna premenná public class Pes { staticString typ; } • Ak typ zmeníme na jednom mieste a potom na druhom mieste, zmena sa opäť prejaví na všetkých psoch! To môže byť šokujúce a prekvapivé! Pes dunčo = new Pes(); dunčo.typ = "štekajúci"; System.out.println(dunčo.typ); Pes lajka = new Pes(); System.out.println(lajka.typ); lajka.typ = "brechajúci"; System.out.println(lajka.typ); System.out.println(dunčo.typ); štekajúci štekajúci brechajúci brechajúci PAZ1c

  6. Inštančné premenné statické public class Pes { staticString typ; } • Statické premenné prináležia triede. Odporúča sa meniť ich obsahy s použitím triedy: Pes.typ = "trhajúci"; Pes lajka = new Pes(); System.out.println(lajka.typ); trhajúci meníme obsah premennej na triede! meníme typ všetkým psom sveta! PAZ1c

  7. Inštančné premenné statické • Zmysluplné použitie vo svete: konštanty public class MatematickeKonstanty { public staticfinal double PI = 3.14; } • Ak chcem použiť PI, stačí double mojePi = MatematickeKonstanty.PI; • Kľúčové slovo final = ,,paródia na const" v Pascale • hodnotu v premennej PI už nemožno zmeniť PAZ1c

  8. Metódy vs premenné Cannot make a static reference to a nonstatic field vek / Statický prístup k nestatickej premennej! • Statické metódy nevidia nestatické inštančné premenné! public class Pes { private int vek; staticvoid štekaj() { for(int i = 0; i < vek; i++) { System.out.println("Haf!"); } } } • Logická otázka + vysvetlenie: keď nemám žiadnu inštanciu, aká je hodnota premennej vek? PAZ1c

  9. Metódy vs premenné • Statické metódy nevidia nestatické inštančné premenné! • Riešenie: ,,ta označím vek ako static!" public class Pes { privatestatic int vek; staticvoid štekaj() { for(int i = 0; i < vek; i++) { System.out.println("Haf!"); } } } • Práve sme zaistili, že zmena veku jedného psa nastaví tento vek aj ostatným psom (žijúcim, aj budúcim) • Statické metódy sa nesmú spoliehať na stav triedy! PAZ1c

  10. Metódy vs premenné • Statické metódy sú akoby globálne funkcie/procedúry Heréza a blasfémia proti OOP! • Narušuje sa princíp čistého OOP • základom sú objekty. Objektom sa posielajú správy (= metódy) • Napriek tomu veľmi užitočný koncept • základ nejedného návrhového vzoru PAZ1c

More Related