Java: Zápis tříd

Z MiS
(Rozdíly mezi verzemi)
Přejít na: navigace, hledání
m (Zprávy/metody: Oprava vzhledu.)
m (Návratová hodnota metody: Doplněno, že po return se již nepokračuje dál...)
 
(Není zobrazeno 9 mezilehlých verzí od 1 uživatele.)
Řádka 12: Řádka 12:
  
 
'''Třída''' představuje „předpis“ pro tvorbu objektů. Ve třídě je tedy popsáno:  
 
'''Třída''' představuje „předpis“ pro tvorbu objektů. Ve třídě je tedy popsáno:  
* jaké vlastnosti mají objekty dané třídy  
+
* jaké vlastnosti mají objekty dané třídy (často se používá termín „atribut“)
 
* a na jaké zprávy umí objekty dané třídy reagovat.
 
* a na jaké zprávy umí objekty dané třídy reagovat.
  
 
  public ''class'' MojeTrida {
 
  public ''class'' MojeTrida {
 
     //
 
     //
     // popis vlastností třídy
+
     // popis vlastností (atributů) třídy
 
     //
 
     //
     // popis zpráv
+
     // popis zpráv (metod, které na zprávy reagují)
 
     //
 
     //
 
  }
 
  }
Řádka 51: Řádka 51:
 
=== Zprávy/metody ===
 
=== Zprávy/metody ===
  
Metoda popisuje, co se má stát, když nám někdo pošle zprávu.
+
* Metoda popisuje, co se má stát, když objektu někdo pošle zprávu.
 +
* Například popisuje, jak má panáček zareagovat, když mu někdo pošle zprávu <code>moveRight</code>.
  
 
Syntaxe:
 
Syntaxe:
Řádka 64: Řádka 65:
 
  private void pridejPanacka(int sloupec) { ... }
 
  private void pridejPanacka(int sloupec) { ... }
  
* Volání („spuštění“) metod viz kapitola [[#Přístup do třídy|Přístup do třídy &rarr; Volání metod]].
+
* Zápis volání („spuštění“) metod viz kapitola [[#Volání metod|Volání metod]].
 +
 
 +
=== Parametr metody ===
 +
* U&nbsp;některých zpráv je třeba uvést doplňující informace. Ty uvádíme formou ''parametrů metody''.
 +
* Parametry píšeme do závorek za název metody a uvádíme vždy datový typ a název parametru.
 +
 
 +
; Příklad:
 +
Metody s parametry:
 +
public void nastavDelku(int novaDelka) {
 +
this.delka = novaDelka; // Používám hodnotu parametru.
 +
}
 +
public void naloz(Zbozi coNalozit, double hmotnostKusu, int pocetKusu) {
 +
System.out.println("Naloženo: "+pocetKusu+" kusů zboží:  "+coNalozit+".")
 +
        ...
 +
}
 +
Takovou metodu pak voláme:
 +
Lod lod = new Lod();
 +
lod.nastavDelku(35);
 +
double hmostnostKontejneru = 30.8;
 +
lod.naloz("Kontejner", hmotnostKontejneru, 8);
 +
 
  
 
=== Návratová hodnota metody ===
 
=== Návratová hodnota metody ===
 
* Pokud má metoda návratový typ jiný než <code>void</code>, tak na konci potřebujeme vrátit výsledek.
 
* Pokud má metoda návratový typ jiný než <code>void</code>, tak na konci potřebujeme vrátit výsledek.
 
* Použijeme klíčové slovo <code>return</code>.
 
* Použijeme klíčové slovo <code>return</code>.
 +
* Jakmile použijeme <code>return</code>, metoda okamžitě skončí a dále se nepokračuje.
  
 
; Příklad:
 
; Příklad:
Řádka 80: Řádka 102:
  
 
=== Konstruktor ===
 
=== Konstruktor ===
 +
* Konstruktor třídy popisuje, co se má stát při vytvoření nové instance třídy.
 +
* Můžeme si ho představit jako „metodu“, která se volá při zavolání operátoru <code>new</code>.
 +
 +
; Syntaxe:
 +
public class ''NazevTridy'' {
 +
 +
    // Tady je konstruktor:
 +
    [[Java: Modifikátory přístupu|modifikátor_přístupu]] ''NazevTridy''(''parametry'') {
 +
        ''// ... Co se má dít...''
 +
    }
 +
    ''// ... Další metody''
 +
}
 +
 +
<div class="Poznamka">
 +
; Poznámky
 +
* Můžeme použít více konstruktorů, které se budou lišit počtem či typem parametrů (nebo obojím).
 +
* Pokud nezapíšeme žádný konstruktor, překladač vytvoří automaticky konstruktor bez parametrů.
 +
* Z&nbsp;jednoho konstruktoru můžeme vyvolat jiný konstruktor. Musíme to však provést jako první příkaz konstruktoru:
 +
this(''parametry'');
 +
</div>
 +
 +
; Příklad
 +
Třída <code>Zbozi</code> s konstruktory:
 +
public class Zbozi {
 +
    String nazev;
 +
    TypZachazeni omezeni;
 +
    int cena;
 +
    ...
 +
 +
    ''// První konstruktor''
 +
    public Zbozi(String nazev) {
 +
        this.nazev = nazev;
 +
        this.omezeni = TypZachazeni.zadneOmezeni();
 +
        this.cena = 0;
 +
    }
 +
 +
    ''// Druhý konstruktor''
 +
    public Zbozi(String nazev, int cena) {
 +
        this(nazev); // volání druhého konstruktoru
 +
        this.cena = cena; // doplnění ceny podle parametru
 +
    ...
 +
}
 +
 +
Vytvoření instance třídy <code>Zbozi</code> (viz [[#Vytvoření instance]]):
 +
Zbozi z1 = new Zbozi("Klavír");
 +
String nazev = "Kaktus";
 +
Zbozi z2 = new Zbozi(nazev, 150);
  
 
== Použití třídy ==
 
== Použití třídy ==
Řádka 89: Řádka 158:
 
  <code>Automobil a1 = '''new''' Automobil(5);</code>
 
  <code>Automobil a1 = '''new''' Automobil(5);</code>
  
=== Přístup do třídy ===
+
=== Volání metod ===
; Volání metod:
+
* Volání metody instance nebo též zaslání zprávy instanci znamená, že ''spustíme'' kód, který je v&nbsp;metodě připraven.
 +
* Příkazy zapsané v&nbsp;metodě se tedy provedou a&nbsp;metoda případně vrátí návratovou hodnotu.
 +
 
 +
Syntaxe:
 +
''instance_třídy''.''nazevMetody'' '''(''' ''hodnoty_parametrů'' ''');'''
 +
 
 +
Příklady:
 +
this.act();
 +
 
 +
int vzdalenost = panacek.distanceTo(this);
 +
 
 +
double celkem;
 +
celkem = this.ujetaVzdalenost();
 +
 
 +
this.getWorld().pridejPanacka(3);
 +
 
 
  Obdelnik o = new Obdelnik(5, 4);
 
  Obdelnik o = new Obdelnik(5, 4);
 
  o.posun(10, 10);
 
  o.posun(10, 10);
 
  System.out.println(o.plocha());
 
  System.out.println(o.plocha());
  
; Přístup k atributům:
+
=== Přístup k atributům ===
 
  o.poziceX = 10;
 
  o.poziceX = 10;
 
  System.out.println(o.poziceY);
 
  System.out.println(o.poziceY);
  
Přístup k atributům je ovlivněn [[Java: Modifikátory přístupu|modifikátory přístupnosti]].
+
Přístup k atributům je ovlivněn [[Java: Modifikátory přístupu|modifikátory přístupu]].
  
 
<div class="Varovani">POZOR! Přistupovat k atributům třídy z jiných tříd porušuje dobré zvyklosti objektově orientovaného programování!</div>
 
<div class="Varovani">POZOR! Přistupovat k atributům třídy z jiných tříd porušuje dobré zvyklosti objektově orientovaného programování!</div>
 +
 +
 +
== Shrnutí ==
 +
Jaké pojmy byste měli znát?
 +
* třída
 +
* instance třídy, objekt
 +
* atribut
 +
* metody
 +
* konstruktor
 +
* parametry
 +
* návratová hodnota
 +
 +
 +
== Související stránky ==
 +
* [[Platnost proměnných]], [[Java: Modifikátory přístupu]], [[Objektově orientované programování]]
 +
  
 
== Další zdroje ==
 
== Další zdroje ==
 
* Pitner Tomáš. Programování v jazyce Java. 2003. Dostupné z: http://www.fi.muni.cz/~tomp/slides/pb162/printable.html
 
* Pitner Tomáš. Programování v jazyce Java. 2003. Dostupné z: http://www.fi.muni.cz/~tomp/slides/pb162/printable.html

Aktuální verze z 21. 3. 2017, 10:21


Java je objektově orientovaný jazyk. Chování systému (a tedy algoritmus) popisujeme jako komunikaci mezi objekty, které mají vlastnosti (atributy) a posílají si zprávy.

Zde uvádíme pouze syntaxi zápisu v Javě s minimem teorie. Více o OOP a jeho principech a konstruktech viz Objektově_orientované_programování.

Při zápisu programu v Javě se budeme řídit dohodnutými konvencemi pro zápis kódu.

Obsah

Třída

Třída představuje „předpis“ pro tvorbu objektů. Ve třídě je tedy popsáno:

public class MojeTrida {
   //
   // popis vlastností (atributů) třídy
   //
   // popis zpráv (metod, které na zprávy reagují)
   //
}


Atributy

Nebo také vlastnosti popisují stav objektu. Z reálného objektu si vybíráme pouze ty vlastnosti, které jsou pro náš systém důležité.

Třeba třída Automobil bude mít v nějakém systému jako vlastnost jmenoVlastnika a nebude mít žádnou vlastnost, popisující výkon motoru. Pro náš systém je to tak vhodné. Jiný systém může u automobilu sledovat výkon a ne jméno vlastníka.

Zápis atributu:

Příklad:

int delka;
public String jmeno;

Tedy ve třídě:

public class Zbozi {
   String nazev;
   TypZachazeni omezeni;
   int cena;
   ...
}

Zprávy/metody

Syntaxe:

modifikátor_přístupu návratový_typ nazevMetody ( parametry_oddělené_čárkou ) { 
    popis, co se má dělat v reakci na metodu 
}

Příklady:

public void act() { ... }
public int distanceTo(Enemy enemy) { ... }
protected double ujetaVzdalenost() { ... }
private void pridejPanacka(int sloupec) { ... }

Parametr metody

Příklad

Metody s parametry:

public void nastavDelku(int novaDelka) {
	this.delka = novaDelka; // Používám hodnotu parametru.
}
public void naloz(Zbozi coNalozit, double hmotnostKusu, int pocetKusu) {
	System.out.println("Naloženo: "+pocetKusu+" kusů zboží:  "+coNalozit+".")
       ...
}

Takovou metodu pak voláme:

Lod lod = new Lod();
lod.nastavDelku(35);
double hmostnostKontejneru = 30.8;
lod.naloz("Kontejner", hmotnostKontejneru, 8);


Návratová hodnota metody

Příklad
public double ujetaVzdalenost() {
	double vysledek = 0;
	
	// ... tady nějak spočítám výsledek... ;)
	
	return vysledek;
}

Konstruktor

Syntaxe
public class NazevTridy {

    // Tady je konstruktor:
    modifikátor_přístupu NazevTridy(parametry) {
       // ... Co se má dít...
    }
    // ... Další metody
}
Poznámky
  • Můžeme použít více konstruktorů, které se budou lišit počtem či typem parametrů (nebo obojím).
  • Pokud nezapíšeme žádný konstruktor, překladač vytvoří automaticky konstruktor bez parametrů.
  • Z jednoho konstruktoru můžeme vyvolat jiný konstruktor. Musíme to však provést jako první příkaz konstruktoru:
this(parametry);
Příklad

Třída Zbozi s konstruktory:

public class Zbozi {
    String nazev;
    TypZachazeni omezeni;
    int cena;
    ...

    // První konstruktor
    public Zbozi(String nazev) {
        this.nazev = nazev;
        this.omezeni = TypZachazeni.zadneOmezeni();
        this.cena = 0;
    }

    // Druhý konstruktor
    public Zbozi(String nazev, int cena) {
        this(nazev); // volání druhého konstruktoru
        this.cena = cena; // doplnění ceny podle parametru
    ...
}

Vytvoření instance třídy Zbozi (viz #Vytvoření instance):

Zbozi z1 = new Zbozi("Klavír");
String nazev = "Kaktus";
Zbozi z2 = new Zbozi(nazev, 150);

Použití třídy

Vytvoření instance

new NazevTridy(hodnoty_parametrů_konstruktoru)
Automobil a1 = new Automobil(5);

Volání metod

Syntaxe:

instance_třídy.nazevMetody ( hodnoty_parametrů );

Příklady:

this.act();
int vzdalenost = panacek.distanceTo(this);
double celkem;
celkem = this.ujetaVzdalenost();
this.getWorld().pridejPanacka(3);
Obdelnik o = new Obdelnik(5, 4);
o.posun(10, 10);
System.out.println(o.plocha());

Přístup k atributům

o.poziceX = 10;
System.out.println(o.poziceY);

Přístup k atributům je ovlivněn modifikátory přístupu.

POZOR! Přistupovat k atributům třídy z jiných tříd porušuje dobré zvyklosti objektově orientovaného programování!


Shrnutí

Jaké pojmy byste měli znát?


Související stránky


Další zdroje

Osobní nástroje
Jmenné prostory
Varianty
Akce
Výuka
Navigace
Nástroje