Java: Zápis tříd
|  (→Popis třídy:  Přidány objekt a třída) |  (→Konstruktor:  Upraven příklad volání více konstruktorů - základní je lepší mít plnohodnotný (se všemi atributy)) | ||
| (Není zobrazeno 18 mezilehlých verzí od 1 uživatele.) | |||
| Řádka 1: | Řádka 1: | ||
| − | [[Category:VSE]][[Category:Informatika]][[Category:Programování]] | + | [[Category:VSE]][[Category:Informatika]][[Category:Programování]][[Category:Java]] | 
| − | + | Java je [[Objektově orientované programování|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''. | |
| − | + | <div class="Upozorneni"> | |
| − | + | 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í]]. | |
| − | + | </div> | |
| − | + | ||
| − | + | ||
| Při zápisu programu v Javě se budeme řídit dohodnutými [[Konvence | konvencemi pro zápis kódu]]. | Při zápisu programu v Javě se budeme řídit dohodnutými [[Konvence | konvencemi pro zápis kódu]]. | ||
| Řádka 14: | Řá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 27: | Řádka 25: | ||
| === Atributy === | === 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é. | ||
| + | |||
| + | <div class="Priklad"> | ||
| + | ''Třeba třída <code>Automobil</code> bude mít v nějakém systému jako vlastnost <code>jmenoVlastnika</code> 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.'' | ||
| + | </div> | ||
| + | |||
| + | Zápis atributu: | ||
| + | * může být [[Java: Modifikátory přístupu | modifikátor přístupu]] | ||
| + | * [[Java: Datové typy | datový typ]] | ||
| + | * název | ||
| + | |||
| + | Příklad: | ||
| + |  int delka; | ||
| + |  public String jmeno; | ||
| + | |||
| + | Tedy ve třídě: | ||
| + |  public class Zbozi { | ||
| + |     String nazev; | ||
| + |     TypZachazeni omezeni; | ||
| + |     int cena; | ||
| + |     ... | ||
| + |  } | ||
| === Zprávy/metody === | === Zprávy/metody === | ||
| + | |||
| + | * 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: | ||
| + |  ''[[Java: Modifikátory přístupu|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) { ... } | ||
| + | |||
| + | * Zápis volání („spuštění“) metod viz kapitola [[#Volání metod|Volání metod]]. | ||
| + | |||
| + | === Parametr metody === | ||
| + | * U 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 === | ||
| + | * 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>. | ||
| + | * Jakmile použijeme <code>return</code>, metoda okamžitě skončí a dále se nepokračuje. | ||
| + | |||
| + | ; Příklad: | ||
| + |  public double ujetaVzdalenost() { | ||
| + |  	double vysledek = 0; | ||
| + | |||
| + |  	// ... tady nějak spočítám výsledek... ;) | ||
| + | |||
| + |  	return vysledek; | ||
| + |  } | ||
| === 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 | ||
| + | * Pokud nezapíšeme žádný konstruktor, překladač vytvoří automaticky konstruktor bez parametrů. | ||
| + | * Můžeme použít více konstruktorů, které se budou lišit počtem či typem parametrů (nebo obojím). | ||
| + | * Z 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; | ||
| + |      int pocet; | ||
| + |      ... | ||
| + | |||
| + |      ''// První konstruktor'' | ||
| + |      public Zbozi(String nazev, int pocet) { | ||
| + |          this.nazev = nazev; | ||
| + |          this.pocet = pocet; | ||
| + |      } | ||
| + | |||
| + |      ''// Druhý konstruktor'' | ||
| + |      public Zbozi(String nazev) { | ||
| + |          this(nazev, 1); // volání druhého konstruktoru — jako počet se použije hodnota 1 | ||
| + |      } | ||
| + |  } | ||
| + | |||
| + | 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, 5); | ||
| == Použití třídy == | == Použití třídy == | ||
| Řádka 41: | Řádka 156: | ||
| === 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 metodě připraven. | ||
| + | * Příkazy zapsané v metodě se tedy provedou a 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); | ||
| + |  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 [[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> | ||
| + | |||
| + | |||
| + | == 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 4. 9. 2024, 20:58
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:
- 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.
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:
- může být modifikátor přístupu
- datový typ
- název
Příklad:
int delka; public String jmeno;
Tedy ve třídě:
public class Zbozi {
   String nazev;
   TypZachazeni omezeni;
   int cena;
   ...
}
Zprávy/metody
- 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 moveRight.
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) { ... }
- Zápis volání („spuštění“) metod viz kapitola Volání metod.
Parametr metody
- U 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
-  Pokud má metoda návratový typ jiný než void, tak na konci potřebujeme vrátit výsledek.
-  Použijeme klíčové slovo return.
-  Jakmile použijeme return, metoda okamžitě skončí a dále se nepokračuje.
- Příklad
public double ujetaVzdalenost() {
	double vysledek = 0;
	
	// ... tady nějak spočítám výsledek... ;)
	
	return vysledek;
}
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 new.
- Syntaxe
public class NazevTridy {
    // Tady je konstruktor:
    modifikátor_přístupu NazevTridy(parametry) {
       // ... Co se má dít...
    }
    // ... Další metody
}
- Poznámky
- Pokud nezapíšeme žádný konstruktor, překladač vytvoří automaticky konstruktor bez parametrů.
- Můžeme použít více konstruktorů, které se budou lišit počtem či typem parametrů (nebo obojím).
- 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;
    int pocet;
    ...
    // První konstruktor
    public Zbozi(String nazev, int pocet) {
        this.nazev = nazev;
        this.pocet = pocet;
    }
    // Druhý konstruktor
    public Zbozi(String nazev) {
        this(nazev, 1); // volání druhého konstruktoru — jako počet se použije hodnota 1
    }
}
Vytvoření instance třídy Zbozi (viz #Vytvoření instance):
Zbozi z1 = new Zbozi("Klavír");
String nazev = "Kaktus";
Zbozi z2 = new Zbozi(nazev, 5);
Použití třídy
Vytvoření instance
- Obecně
new NazevTridy(hodnoty_parametrů_konstruktoru)
- Například:
Automobil a1 = new Automobil(5);
Volání metod
- Volání metody instance nebo též zaslání zprávy instanci znamená, že spustíme kód, který je v metodě připraven.
- Příkazy zapsané v metodě se tedy provedou a 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); 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.
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
Další zdroje
- Pitner Tomáš. Programování v jazyce Java. 2003. Dostupné z: http://www.fi.muni.cz/~tomp/slides/pb162/printable.html
