7. Statické prvky třídy

Podobné dokumenty
Programování v Javě I. Únor 2009

Programování v Javě I. Leden 2008

Výčtový typ strana 67

Algoritmizace a programování. Terminálový vstup a výstup

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

8 Třídy, objekty, metody, předávání argumentů metod

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

7. přednáška - třídy, objekty třídy objekty atributy tříd metody tříd

Principy objektově orientovaného programování

Seminář Java II p.1/43

Úvod do programovacích jazyků (Java)

17. Projekt Trojúhelníky

Teoretické minimum z PJV

IRAE 07/08 Přednáška č. 2. atr1 atr2. atr1 atr2 -33

1. Dědičnost a polymorfismus

Obsah přednášky 7. Základy programování (IZAPR) Přednáška 7. Parametry metod. Parametry, argumenty. Parametry metod.

7. Datové typy v Javě

3. Třídy. Základní pojmy objektového programování. Třídy

11. Dědičnost. Dědičnost strana 103

1. Programování proti rozhraní

15. Projekt Kalkulačka

Programování v C++ 3, 3. cvičení

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Statické proměnné a metody. Tomáš Pitner, upravil Marek Šabo

Generické programování

1. Téma 03 - Rozhodování

Obsah přednášky 9. Skrývání informací. Skrývání informací. Zapouzdření. Skrývání informací. Základy programování (IZAPR, IZKPR) Přednáška 9

11 Diagram tříd, asociace, dědičnost, abstraktní třídy

Programování II. Návrh programu I 2018/19

Paměť počítače. alg2 1

Programovací jazyk Java

PREPROCESOR POKRAČOVÁNÍ

20. Projekt Domácí mediotéka

Projekt Obrázek strana 135

Desetinná čísla. pro celá čísla jsme používali typ int. pro desetinná čísla používáme typ double

Objektově orientované programování

Podmínky na zápočet. Java, zimní semestr

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Objekty strana 11. Abstrakce je základní objektovou vlastností. Skutečnost, kterou chceme do programu promítnout,

Úvod Třídy Rozhraní Pole Konec. Programování v C# Hodnotové datové typy, řídící struktury. Petr Vaněček 1 / 39

Soubor jako posloupnost bytů

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Algoritmizace a programování

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

IRAE 07/08 Přednáška č. 1

DUM 06 téma: Tvorba makra pomocí VBA

Třídy. Instance. Pokud tento program spustíme, vypíše následující. car1 má barvu Red. car2 má barvu Red. car1 má barvu Blue.

Definice třídy. úplná definice. public veřejná třída abstract nesmí být vytvářeny instance final nelze vytvářet potomky

Algoritmizace a programování

Abstraktní třída a rozhraní

Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Vytváření a použití knihoven tříd

10 Balíčky, grafické znázornění tříd, základy zapozdření

typová konverze typová inference

Úvod do programování - Java. Cvičení č.4

Tento studijní blok má za cíl pokračovat v základních prvcích jazyka Java. Konkrétně bude věnována pozornost rozhraním a výjimkám.

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Logování zaznamenávání informací o průběhu programu, ladících a chybových informací

Předmluva k aktuálnímu vydání Úvod k prvnímu vydání z roku Typografické a syntaktické konvence... 20

PŘETĚŽOVÁNÍ OPERÁTORŮ

IRAE 07/08 Přednáška č. 7. Začátek (head)

Remote Method Invocation RMI

Počítačové laboratoře bez tajemství aneb naučme se učit algoritmizaci a programování s využitím robotů CZ.1.07/1.3.12/

DUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA

Programování v C++ 2, 4. cvičení

IAJCE Přednáška č. 7. řízení semaforu na křižovatce = přepínání červená/oranžová/zelená

Java Cvičení 01. CHARLES UNIVERSITY IN PRAGUE faculty of mathematics and physics

Zápis programu v jazyce C#

4. ZÁKLADNÍ POJMY Z OBJEKTOVĚ ORIENTOVANÉHO PROGRAMOVÁNÍ

Úvod do programovacích jazyků (Java)

Programové konvence, dokumentace a ladění. Programování II 2. přednáška Alena Buchalcevová

TŘÍDY POKRAČOVÁNÍ. Události pokračování. Příklad. public delegate void ZmenaSouradnicEventHandler (object sender, EventArgs e);

Algoritmizace a programování

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

NMIN201 Objektově orientované programování 1 / :36:09

NPRG031 Programování II 1 / :25:46

Z. Kotala, P. Toman: Java ( Obsah )

Datové typy strana 29

Více o konstruktorech a destruktorech

Programování v C++ 1, 5. cvičení

Regulární výrazy. Vzory

Programování v C++ 1, 6. cvičení

Programování II. Polymorfismus

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

Úvod do programovacích jazyků (Java)

Algoritmizace a programování

Jazyk C# (seminář 6)

Algoritmizace a programování

KTE / ZPE Informační technologie

Neměnné objekty. Tomáš Pitner, upravil Marek Šabo

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

KTE / ZPE Informační technologie

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Objektově orientované programování v jazyce Python

Windows je registrovaná obchodní známka firmy Microsoft v USA a v ostatních zemích.

Třídy, polymorfismus. A0B36PR2-Programování 2 Fakulta elektrotechnická České vysoké učení technické

Skripta ke školení. Základy VBA. vypracoval: Tomáš Herout. tel:

Transkript:

Statické prvky třídy strana 61 7. Statické prvky třídy V úvodních kapitolách jsme popsali deklaraci a používání datových atributů a metod instance. Jsou to nejčastě ji používané součásti třídy, nicméně třída v Javě může obsahovat ještě další prvky. Nyní si popíšeme význam a použití statických datových atributů a statických metod. 7.1. Statické datové atributy (statické proměnné, proměnné třídy) Statický datový atribut (též statická proměnná či proměnná třídy) je společný pro všechny instanc e dané třídy. V deklaraci je za modifikátorem přístupu uveden modifikátor static. Při vysvětlování statických proměnných budeme pokračovat v našem jednoduchém příkladě s účty. Budem e mít úrok z uložených peněz, který bude pro všechny účty stejný. Můžeme do každé instance přidat datový atribut urok, který bude mít vždy stejnou hodnotu. Při změně úroku však budeme muset zavolat metodu pro změnu úroku u každé instance. Druhým a lepším řešením je použití statické proměnné, která bude v paměti pouze jednou a o které budou vědět všechny instance. Tato proměnná vznikne při natažení kódu třídy Ucet do paměti, tj. ještě před vytvořením první instance. Deklaraci všech datových atributů včetně statického je v následujícím kódu. public class Ucet { private static double urok = 2.5; priva te int cislouctu; private String jmenovlastnika; private double castka = 0; //zde následuje další kód třídy Z jiných tříd se na statickou proměnnou odkazujeme se jménem třídy např. Ucet.urok (v našem případě tuto konstrukci nelze použít, protože proměnná třídy byla deklarována private). Uvnitř kódu třídy Ucet se na ni odkazujeme pouze pomocí identifikátoru. Obrázek 7.1 Znázornění vztahu mezi instancemi třídy a statickým datovým atributem Jak již b ylo řečeno, statická proměnná existuje v paměti jen jednou a vědí o ní všechny instance. Zjednodušeně je vztah instancí ke statické proměnné znázorněn na obrázku 7.1. Statické proměnné se též používají pro vytváření pojmenovaných konstant, které jsou uvozeny modifikátory public static final (je to jedna z mála situací, kdy datové atributy nejsou private). Hodnotu pojmenovaných konstant nelze po přiřazení změnit (modifikátor final), proto mohou být veřejné. Použití modifikátoru static znamená, že tyto konstanty jsou v paměti uloženy pouze jednou. Ukázka deklarace takové konstanty vypadá následovně: public static final double PI = 3.14;

Statické prvky třídy strana 62 Dalším příkladem pojmenovaných konstant mohou být konstanty ve třídě Math hodnota pí (π) či Eulerova konstanta. 7.2. Statick á metoda (metoda třídy) Statická metoda (též se používá pojem metoda třídy) je metoda společná pro všechny instance, která má při deklaraci uveden modifikátor static. Statické metody jsou nezávislé na jakékoliv instanci třídy, tj.: pro použití není potřeba vytvořit žádnou instanci, statická metoda se nemůže přímo odkazovat na datové atributy instance či metody instance, ve statické metodě lze ale vytvořit instanci třídy a poslat ji zprávu, z instance lze přímo volat statické metody, statická metoda může přímo použít statické proměnné. V našem příkladu vytvoříme statickou metodu na změnu úroku. Pro všechny účty najednou změníme výši úročení vkladů. Metoda se jmenuje seturok() a má parametr typu double. Pojmenování seturok() opět souvisí s konvencemi v Javě, kdy metoda, která slouží k nastavení nebo změně hodnoty datového atributu se pojmenovává setjmenoatributu. Kromě metody pro změnu úroku bychom mohli napsat i statickou metodu geturok(), která by vracela aktuální hodnotu úroku. I tato metoda by měla v hlavičce m odifikátor static. Kód metody seturok() vypadá takto: public static void seturok (double novyurok) { urok = novyurok; Pro volání metody seturok() není nutné mít vytvořenou instanci. Mimo kód třídy Ucet se metoda volá pomocí jména třídy a tečky tedy: Ucet.setUrok(3.0); Ve třídě Ucet (tj. v jiné metod ě stejné třídy ) se lze na tuto metodu odkazovat také celým jménem včetně názvu třídy, či pouze jménem metody překladač jméno třídy doplní. Statické metody se používají ve více situacích: pro změnu statického datového atributu (viz předchozí příklad), pro získání hodnoty statického datového atributu (pokud je private). pro provedení operace, u které není potřeba instance příkladem mohou být matematické operace, např. sin, cos, druhá odmocnina. Třída Math a další příklady tohoto použití jsou v další části této kapitoly. Dalším příkladem těchto statických metod může být např. metoda parseint() ve třídě Integer, která převede řetězec na proměnnou typu int. pro získání instance třídy v situaci, kdy pomocí přetížení konstruktoru nelze odlišit jednotlivé varianty vstupních parametrů. Příkladem může být konstruktor pro vytvoření trojúhelníka nejsme schopni pomocí parametrů odlišit variantu, kdy jsou zadány tři strany od varianty, kdy zadáme dvě strany a jeden úhel (v obou případech budou zadána 3 reálná čísla). Proto použijeme statické metody, které s e liší názvem. Bližší popis je v projektu Trojuhelniky. pro získání instance třídy v situaci, kdy na základě parametrů vrací statická metoda různé instance toto souvisí s dědičností a polymorfismem. Příkladem může být získání ovladače k SQL databázi pomocí metody forname() ze třídy Class. Podrobnější popis této problematiky je mimo zaměření skript. 7.3. Statické datové atributy a metody ve třídách Math a System 7.3.1. Třída Math Třída Math ze standardu Javy obsahuje pouze statické konstanty a statické metody. Třída nemá veřejný konstruktor, nelze tedy vytvořit instanci a ani to není smysluplné. Takto navržená třída se označuje jako utilita.

Statické prvky třídy strana 63 Dvě konstanty ze třídy Math jsou uvedeny v tabulce 7.1, vybrané statické metody ze třídy Math jsou v tabulce 7.2. konstanty třídy Math.PI Math.E význam hodnota pí (π) Eulerova konstanta přirozeného logaritmu Tabulka 7.1 Konstanty třídy Math statické metody ve třídě popis metody double Math.abs(double a) absolutní hodnota double Math.ceil(double a) zaokrouhlení na nejbližší vyšší celé číslo double Math.floor(double a) zaokrouhlení na nejbližší nižší celé číslo double Math.rint(double a) zaokrouhlení na nejbližší celé číslo double Math.sin(double a) sin úhlu v radiánech double Math.cos(double a) cos úhlu v radiánech double Math.tan(double a) tangens úhlu v radiánech double Math.toDegrees(double a) převod úhlu v radiánech do stupňů double Math.toRadians(double a) převod úhlu ve stupních do radiánů double Math.pow(double a, double b) mocnina a b double Math.sqrt(double a) druhá odmocnina double Math.log(double a) přirozený logaritmus double Math.log10(double a) desítkový logaritmus double Math.exp(double a) přirozená mocnina e a Tabulka 7.2 Přehled vybraných metod třídy Math 7.3.2. Třída System Třída System z balíčku java.lang poskytuje tři statické proměnné sloužící pro vstup a výstup z/na konzoly. statická proměnná InputStream System.in PrintStream System.out PrintStream System.err popis vstup z konzoly výstup na konzolu chybový výstup Tabulka 7.3 Přehled statických proměnných třídy System Podrobný popis typů InputStream a PrintStream je uveden v kapitole věnované vstupu a výstupu. Zde si jenom uvedeme, že u třídy PrintStream se nejčastěji používají následující metody: void println (String text) void print (String text) void printf(string format, Object... args) První metoda vypíše text a odřádkuje, metoda print nedoplňuje na konec výpisu odřádkování. Metoda printf umožňuje formátovat výstup bližší popis je v kapitole věnované třídě String.

Statické prvky třídy strana 64 Pomocí statických metod setin(), setout() a seterr() mohou být tyto statické proměnné přesměrovány jinam. Např. v BlueJ jsou proměnné System.in, System.out a System.err přesměrován y do samostatného grafického okna pojmenovaného Terminal. Další statické metody třídy System jsou uvedeny v tabulce 7.4. hlavička metody void System.exit(int status) String System.getEnv(String name) long System.currentTimeMillis() long System.nanoTime() void System.setSecurityManager (SecurityManager s) Properties System.getProperties() String System.getProperty(String name) String System.setProperty(String name, String value) popis ukončí aplikaci, jako parametr se zadává návratový kód (nula při úspěšném ukončení, kladná čísla pro označení chyby) získání hodnoty environment proměnné (proměnné operačního systému), závisí na operačním systému získání aktuálního času v milisekundách, přesnost závisí na operačním systému získání aktuálního času v nanosekundách, přesnost závisí na operačním systému nastavení správce zabezpečení, toto téma je mimo rozsah těchto skript získání všech proměnných/vlastností JVM, mezi tyto vlastnosti patří verze JVM, identifikace operačního systému, domovský adresář uživatele získání hodnoty konkrétní proměnné/vlastnosti JVM nastavení hodnoty konkrétní proměnné/vlastnosti JVM Tabulka 7.4 Přehled vybraných metod třídy System 7.4. Standardní spouštění aplikace metoda main Aby bylo možno spustit Java aplikaci, musí existovat aspoň jeden vstupní bod do aplikace. V případě apletů se vytvoří instance hlavní třídy apletu a poté se volají metody init(), start(), paint(), stop() a destroy() v závislosti na stavu stránky s apletem. V případě servletů se vytvoří instance třídy a volá se metoda doget(), dopost(), doput(), dodelete() v závislosti na typu požadavku od klienta. Při spouštění Java aplikace v operačním systému se nevytváří automaticky instance, bylo zvoleno řešení s využitím statické metody main(). Při spouštění JVM (příkaz java v operačním systému) říkáme, jaká třída má být natažena do paměti první: java MojeTrida JVM hledá v kódu této třídy statickou metodu main() a tu spustí (pokud metoda main() neexistuje, tak JVM vypíše chybové hlášení). Metoda main() musí splňovat následující pravidla: metoda musí být veřejná ( public), jinak by ji nebylo možné spustit, metoda musí být statická, není vytvořena žádná instance, pro kterou by bylo možné spustit metodu instance, metoda nevrací žádnou hodnotu (není možné nastavit žádnou proměnnou, do které by se uložil výsledek), metoda má jako vstupní parametr pole prvků typu String (jméno args je jediné, co lze v hlavičce metody změnit např. na String parametry [], ale obvykle se název pole parametrů nemění), do tohoto pole se ukládají parametry příkazové řádky.

Statické prvky třídy strana 65 Hlavič ka metody main() je následující: public static void main (String [] args) Aplikace provede kód v metodě main() a skončí (pokud není aplikace ukončena dříve výskytem výjimky nebo metodou System.exit()). Pokud při zpracování metody main() vznikly vlákna, čeká se na jejich dokončení (vlákna vznikají např. při spuštění grafické aplikace). Následuje příklad metody main() v projektu Trojuhelniky (blíže viz kapitola 17): public static void main (String [] args) { Trojuhelniky troj = new Trojuhelniky(); troj.zakladnicyklus(); Při spouštění aplikace lze též zadávat parametry příkazové řádky. Jednotlivé parametry jsou odděleny mezerou, v následující příkladu jsou při spuštění aplikace tří parametry na příkazové řádce: java Pocitej 3 + 5 Tyto parametry jsou dostupné v poli, které předá JVM metodě main() při spuštění. V našem případě bude parametrem pole o třech prvcích. Parametry jsou uloženy jako řetězce (String). Od verze 5.0 lze zapsat metodu main() s použitím proměnlivého počtu parametrů (viz kapitola 10.5): public static void main (String... args) 7.5. Počítání vytvořených instancí Hezkým příkladem na používání statických datových atributů a statických metod je počítání vytvořených instancí nějaké třídy. public class Pokus { private static long pocetinstanci = 0; public Pokus () { pocetinstanci++; // další příkazy konstruktoru public static long getpocetinstanci() { return pocetinstanci; // další části třídy Je nutno zdůraznit, že se počítají vytvořené instance, ne instance existující 14. Počítání existujících instancí je problematické, neboť není přesně určen okamžik, kdy instance přestane existovat. Pro účely počítání instancí můžeme za okamžik zrušení považovat chvíli, kdy Garbage Collector zavolá metodu finalize() popis metody finalize() je v kapitole 6.6. Pro počítání existujících instancí je tudíž ještě potřeba překrýt metodu finalize() celý kód bude vypadat následovně (klíčové slovo super je vysvětleno v kapitole 11.1 věnované dědičnosti): public class Pokus { private static long pocetinstanci = 0; public Pokus () { pocetinstanci++; // další příkazy konstruktoru 14 Ani počet vytvořených instancí nemusí být přesný pokud by třída Pokus měla potomky, tak i vytvoření instance potomka se započte mezi vytvořené instance třídy Pokus (v konstruktoru potomka se vždy volá konstruktor předka). Tj. počítáme vytvořené instance, které lze přetypovat na typ Pokus.

Statické prvky třídy strana 66 public void finalize() { super.finalize(); pocetinstanci--; public static long getpocetinstanci() { return pocetinstanci; // další části třídy Uvedené kódy počítání instancí nefungují správně ve vláknech či při serializaci objektů obě témata jsou však mimo rozsah těchto skript.