V tomto díle bude řeč o základních stavebních kamenech Javy – o objektech. Idea objektového programování spočívá v rozložení celku na jednotlivé objekty (do sebe zanořované komponenty), které navzájem spolupracují a dohromady tak tvoří funkční aplikaci.

Třídy a objekty

Třída (Class) definuje data a metody. Data mohou být buď proměnné primitivního datového typu nebo odkazy na další objekty. Metoda se v objektově orientovaném programování říká procedurám a funkcím.

Třída slouží jako šablona pro vytváření instancí; instancemi tříd jsou objekty. (Samotná třída tedy nepředstavuje vlastní informace, jedná se pouze o předlohu; data obsahují až objekty.) Objektů jedné třídy přitom může existovat libovolné množství (samozřejmě také žádný).

Uvažujme například třídu, která reprezentuje kružnici v rovině. Ta je popsána x-ovou a y-ovou souřadnicí středu a poloměrem. S kružnicí můžeme také dělat různé činnosti – zjišťovat její obvod, obsah nebo ji posouvat. V Javě by definice takové třídy vypadala takto (kruznice.java):

/**
 * Třída popisující kružnici v rovině.
 */
public class Kruznice {
    public double x, y;      // souřadnice středu
    public double r;         // poloměr
    // metoda počítající obvod
    public double obvod () {
      return 2 * 3.1415927 * r;
      }
    // metoda počítající obsah
    public double obsah () {
      return 3.1415927 * r * r;
      }
    // Metoda pro posun kružnice
    public void posun (float dx, float dy) {
      x += dx;
      y += dy;
      }
}

Definice třídy musí být umístěna v souboru, který se jmenuje stejně jako třída. Třída je definována klíčovým slovem class následovaným jménem třídy (Kruznice). Definice třídy je umístěna mezi dvojicí odpovídajících složených závorek, skládá se z definice proměnných a definice metod.

Klíčové slovo public je modifikátor viditelnosti, budeme o nich mluvit v příštím díle seriálu.

Proměnné

Za datovým typem (primitivní nebo referenční datový typ) následuje jméno proměnné, popřípadě seznam proměnných oddělených čárkami.

public double x, y;

Při definici proměnných je rovněž možné přiřadit proměnné implicitní hodnotu.

public double r = 1;

Metody

Návratový typ metody může být primitivní datový typ, reference nebo void (žádná hodnota není vrácena). Za návratovým typem a názvem metody je v kulatých závorkách napsán seznam parametrů (a jejich typů) oddělených čárkami. Výsledek metody (návratová hodnota) je uveden klíčovým slovem return, po jeho provedení se zpracování metody ukončí.

Metoda součet má dva parametry typu float (desetinné číslo) a vrací hodnotu typu float:

double soucet (float a, float b) {
  float c;
  c = a + b;
  return c;
  }

Metoda obvod nemá žádný parametr a vrací hodnotu typu double:

double obvod () {
  return 2 * 3.1415927 * r;
  }

Vytváření objektu

Objekt vytváříme pomocí klíčového slova new. Pokud chceme vytvořit instanci třídy Kruznice, nejprve nadeklamujeme proměnnou tohoto typu …

Kruznice k;

… a poté novou instanci vytvoříme.

k = new Kruznice();

K přístupu k proměnným a metodám objektu se v Javě používá tečková notace.

k.x = 5;
k.y = k.x+3;
k.r = k.r/2;
double obs = k.obsah();  // volání metody obsah

Konstruktory

Speciálním typem metody je tzv. konstruktor. Tato metoda nemá jméno (jmenuje se stejně jako třída) a obsahuje inicializaci objektu. Konstruktor je volán automaticky při vytváření objektu. Pokud při deklaraci konstruktor nepopíšete (jako u naší třídy Kruznice), konstruktor je automaticky prázdný.

Konstruktorů jednoho objektu může být i více, musí se však lišit v parametrech, aby Java poznala, který konstruktor chcete zavolat.

Pomocí klíčového slova this se můžete odkazovat na jiný konstruktor stejné třídy nebo na proměnné této třídy (zejména pokud se parametry konstruktoru jmenují stejně jako proměnné třídy).

Pokud do třídy Kruznice přidáme konstruktory, může vypadat takto:

/**
 * Třída popisující kružnici v rovině.
 */
public class Kruznice {
    public double x, y;      // souřadnice středu
    public double r;         // poloměr
    public Kruznice (float x, float y, float r) {
      this.x = x;
      this.y = y;
      this.r = r;
      }
    public Kruznice (float x, float y) {
      this (x, y, 1);
      }
    public Kruznice () {
      x = y = 0;
      r = 1;
      }
    public double obvod () {
      return 2 * 3.1415927 * r;
      }
    public double obsah () {
      return 3.1415927 * r * r;
      }
    public void posun (float dx, float dy) {
      x += dx;
      y += dy;
      }
}

Objekt třídy Kruznice pak můžeme založit:

Kruznice k1 = new Kruznice(5, 5, 2);   // 5, 5, 2
Kruznice k2 = new Kruznice(4, 5);      // 4, 5, 1
Kruznice k3 = new Kruznice();          // 0, 0, 1

Rušení objektu

V Javě se objekty ruší automaticky, pokud na ně zanikne poslední reference a nemohou být dále použity. Nemusíte se tedy starat o uvolňování paměti, což vám může ušetřit bezesné noci hledání chyb. Tuto činnost zajišťuje tzv. Garbage collector (sběrač odpadků), který si pamatuje počet odkazů na jednotlivé objekty a když zanikne poslední, označí takový objekt ke smazání. Až je volný čas (program nepracuje), smaže ho.

Pokud chcete před zánikem objektu spustit ukončovací kód (např. pro uzavření komunikačních kanálů, souborů apod.), umístěte tento kód do metody finalize.

protected void finalize () {
  zavriKomunikacniKanaly();
  }

V příštím díle budeme ještě s objekty pokračovat, podíváme se na dědičnost objektů a na proměnné a metody tříd.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět