Obsah

Pokročilé vlastnosti

V této kapitole si řekneme něco o referenci this, statických atributech a konstantách. Referenci this můžeme použít v konstruktorech a instančních metodách. Odkazuje na instanci, s níž v daném okamžiku pracujeme. Pomocí this lze aktuální instanci předat jako parametr při volání metody nebo konstruktoru.

  class Bod {
     int x, y;
     Bod( Bod b ) {
        x = b.x;
        y = b.y;
     }
     Bod vytvorKopii() {
        return new Bod( this );
     }
  } 
Metoda vytvorKopii() vytvoří identickou kopii daného objektu.
  Bod p1 = new Bod( 10, 20 );
  Bod p2 = p1.vytvorKopii(); 

reference this

V bodě 2 reference this odkazuje na objekt, od něhož jsme zavolali metodu nastav. Referenci this používáme také pro přístup k atributu, který se jmenuje stejně jako lokální proměnná. Je např. běžné, že parametry konstruktoru se jmenují stejně jako atributy, které chceme těmito parametry inicializovat.

  class Bod {
     int x, y;
     Bod( int x, int y ) {
        this.x = x;
        this.y = y;
     }
     void nastavX( int x ) {
        this.x = x;
     }
     void nastavY( int y ) {
        this.y = y;
     }
  } 
Kromě instančních atributů je možné ve třídě deklarovat statické (třídní) atributy. Deklarují se pomocí klíčového slova static a na rozdíl od instančních atributů existují v paměti vždy pouze jednou. Jsou nezávislé na instancích dané třídy.
  class Auto {
     static int maxId;
  } 
Ke statickým atributům přistupujeme pomocí jména třídy.
  Auto.maxId = 1000;
  System.out.println( Auto.maxId ); 
Paměť je statickým atributům přidělena bezprostředně po natažení třídy do paměti. Natažení třídy do paměti se provede těsně před jejím prvním použitím. Statické atributy jsou stejně jako instanční atributy automaticky inicializovány nulovými hodnotami. K inicializaci jinými hodnotami můžeme použít inicializátory.

statický atribut

Statický atribut může sloužit např. pro počítání počtu instancí dané třídy. (V tomto příkladě předpokládáme, že počet vytvořených instancí nebude větší než maximální hodnota typu long).

  class Osoba {
     static long citac;  // na začátku automaticky 0
     Osoba() {
        // ve třídě Osoba můžeme místo Osoba.citac psát jen citac
        citac++;  // při každém provedení konstruktoru zvýšíme čítač
     }
  } 
Statické atributy lze inicializovat inicializátorem.
  class Osoba {
     static int dalsiId = 100;
  } 
Pro náročnější inicializaci statických atributů lze použít statický inicializátor, což je blok, který se provede bezprostředně po nahrání třídy do paměti.
  class Osoba {
     static int dalsiId;
     static {  // statický inicializátor
        dalsiId = 100;
     }
  } 
Statický inicializátor se hodí např. pokud chceme inicializovat statické atributy hodnotami ze souboru či databáze.

Deklarace konstant se provádí pomocí klíčového slova final. Jména konstant píšeme velkými písmeny. Pokud se jméno konstanty skládá z více slov, oddělujeme slova podtržítkem.

  class Kruznice {
     static final double PI = 3.14159;
     static final double MAX_POLOMER = 10;
  } 
Konstanty jsou v Javě proměnné, do nichž lze přiřadit pouze jednou. Často jsou deklarovány jako statické. Pokud nejsou statické, pak obvykle mají v každé instanci jinou hodnotu.
  class Auto {
     final int MAX_RYCHLOST;
     Auto() {
        MAX_RYCHLOST = (int) (Math.random() * 100 + 30);
     }
  } 
Dvě konstanty z javovského API již známe: Math.PI (Ludolfovo číslo, π) a Math.E (Eulerovo číslo).

Úloha 1

Doplňte tělo konstruktoru.

Úloha 2

Doplňte deklaraci třídy Auto tak, aby každá instance této třídy měla v atributu id unikátní hodnotu. Hodnoty začněte přidělovat od 1.

Úloha 3

Určete, co se vytiskne.

Úloha 4

Doplňte deklaraci statické konstanty MAX typu int. Její hodnotu nastavte na maximální hodnotu v typu byte.

Úloha 5

Určete, co se vytiskne.

Úloha 6

Doplňte křížovku.

Otázky a odpovědi

Student: Mistře, jak mám pojmenovávat třídy, atributy a metody? Mám upřednostňovat jména delší a popisnější nebo jména kratší? Je lepší pojmenovat atribut polomer nebo r?
Java guru: Jména tříd, atributů i metod vybírej tak, aby byl kód srozumitelný. Přitom měj na paměti, že kód po tobě bude velmi pravděpodobně někdo číst. Vhodně zvolené identifikátory mu to mohou ulehčit. Identifikátory by měly být podle tzv. jmenné konvence. Jmenná konvence říká, jak mají vypadat jména tříd, atributů a metod:
  1. Jména tříd začínají velkým písmenem. Pokud se jméno třídy skládá z více slov, slova oddělujeme tak, že první písmeno každého slova je velké. Např. NakladniVuz.
  2. Jména atributů a metod začínají malým písmenem. Pokud se jméno skládá z více slov, první písmeno druhého a dalších slov je velké. Např. maxRychlost či spoctiSpotrebuPaliva.
  3. Jména konstant píšeme velkými písmeny. Je-li jméno složeno z více slov, oddělujeme slova podtržítkem. Např. MAX_RYCHLOST.
Pro lokální proměnné používáme často jednopísmenné identifikátory. Např. i a j jsou častými řídícími proměnnými v cyklu for.