2. díl - První objektová aplikace v Javě - Hello object world

Java Objektově orientované programování První objektová aplikace v Javě - Hello object world

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Minulý díl tutoriálů o Javě nás uvedl do objektově orientovaného programování. Již víme, že objekty mají atributy a metody. Také víme, že k vytvoření objektu vytvoříme nejprve třídu. Ta je vzorem, podle kterého následně tvoříme její instance.

Na začátku kurzu se základními strukturami jazyka Javy jsme si vytvořili program Hello world. Udělejme si nyní podobný program jako úvod do objektově orientovaného programování. Naprogramujme si Hello object world!

Založme si v NetBeans novou Java aplikaci tak, jak jsme to dělali doposud. V Projects klikneme pravým tlačítkem myši na package našeho projektu a vybereme New -> Java Class.

Přidání nové třídy class k Java projektu v NetBeans

Class pojmenujeme Zdravic a potvrdíme. Název třídy píšeme vždy velbloudí notací bez mezer a na rozdíl od proměnných každé slovo má velké první písmeno, tedy i první. Název je samozřejmě také bez diakritiky, tu v programu používáme max. uvnitř textových řetězců, nikoli v identifikátorech.

Vytvoření nové třídy v Javě v NetBeans

Podle této třídy později vytvoříme objekt zdravič, který nás bude umět pozdravit. Vidíme, že se na program již díváme úplně jinak, za každou akci je zodpovědný nějaký objekt, nestačí pouze něco "nabušit" do main(). V našem případě vám to může přijít zbytečné, u složitějších aplikací si to budete pochvalovat :)

V našem package přibude další soubor .java a NetBeans nám ho otevře. K původnímu HelloObjects.java s metodou main() se můžeme vrátit pomocí záložky nebo přes záložku Projects.

Podívejme se, co nám NetBeans vygeneroval a kód si popišme. Následně si do třídy přidáme vlastní metodu pro pozdravení.

package helloobjects;

public class Zdravic {

}

package nám označuje tzv. balíček. Stejně jako se metody sdružují do tříd, tak se třídy sdružují do balíčků. Pokud chceme, aby byla naše třída viditelná i ve výchozí třídě, kde máme metodu main(), musíme ji mít ve stejném balíčku. To zde platí, NetBeans samo novou třídu vloží do toho samého balíčku, vy místo helloobjects budete mít název své aplikace, pokud jste ji nepojmenovali, bude tam javaapplication1.

V package je tedy umístěná samotná třída, která se deklaruje klíčovým slovem class. Třída se jmenuje Zdravic a je prázdná.

Všimněte si, že kód je téměř stejný, jako ten v HelloObjects.java, již tedy rozumíme tomu, co jsme předtím ignorovali. Náš konzolový program byla vlastně třída umístěná v package, která obsahovala jednu metodu main(). Vidíme, že v Javě se v podstatě neobjektově programovat ani nedá, což je jen dobře :)

Nyní si do třídy Zdravic přidáme metodu pozdrav(), bude veřejně viditelná a nebude mít žádnou návratovou hodnotu ani atributy.

Deklarace metody v Javě je tedy následující:

[modifikátor přístupu] [návratový typ] [jmenoMetody]([parametry])

Před metodou bude tzv. modifikátor přístupu, v našem případě public (veřejná). Metoda nebude vracet žádnou hodnotu, toho docílíme klíčovým slovem void. Dále bude následovat samotný název metody, metody píšeme stejně jako proměnné velbloudí notací s malým poč. písmenem. Závorka s parametry je povinná, my ji necháme prázdnou, protože metoda žádné parametry mít nebude. Do těla metody zapíšeme kód pro výpis na konzoli:

Naše třída bude nyní vypadat takto:

public class Zdravic {

        public void pozdrav() {
                System.out.println("Hello object world!");
        }

}

Zde jsme prozatím skončili, přejdeme do HelloObjects.java.

Nyní si v těle metody main() vytvoříme instanci třídy Zdravic. Bude to tedy ten objekt zdravič, se kterým budeme pracovat. Objekty se ukládají do proměnných, název třídy slouží jako datový typ. Instance má zpravidla název třídy, jen má první písmeno malé. Deklarujme si proměnnou a následně v ní založme novou instanci třídy Zdravic:

Zdravic zdravic;
zdravic = new Zdravic();

První řádek říká: "Chci proměnnou zdravic, ve které bude instance třídy Zdravic". S proměnnými jsme vlastně již takto pracovali.

Na druhém řádku je klíčové slovo new, které nám založí novou instanci třídy Zdravic. Tuto instanci přiřadíme do naší proměnné.

Při vytvoření nové instance se zavolá tzv. konstruktor. To je speciální metoda na třídě, proto při vytvoření instance píšeme ty prázdné závorky, jelikož voláme tuto "vytvářecí" metodu. Konstruktor zpravidla obsahuje nějakou inicializaci vnitřního stavu instance (např. dosadí výchozí hodnoty do proměnných). My jsme v kódu žádný konstruktor nedeklarovali, Java si proto vytvořila tzv. implicitní bezparametrický konstruktor. Vytvoření instance objektu je tedy podobné volání metody. Celý zápis můžeme samozřejmě zkrátit na:

Zdravic zdravic = new Zdravic();

Jelikož v proměnné nyní máme opravdu instanci třídy Zdravic, můžeme instanci nechat pozdravit. Zavoláme na ni metodu pozdrav a to jako zdravic.pozdrav(). Kód metody main() bude tedy nyní vypadat následovně:

Zdravic zdravic = new Zdravic();
zdravic.pozdrav();

Program spustíme.

Konzolová aplikace
Hello object world!

Máme tedy svou první objektovou aplikaci!

Dejme nyní naší metodě pozdrav() parametr jmeno, aby dokázala pozdravit konkrétního uživatele:

public void pozdrav(String jmeno) {
        System.out.printf("Ahoj uživateli %s\n", jmeno);
}

Vidíme, že syntaxe parametru metody je stejná, jako syntaxe proměnné. Kdybychom chtěli parametrů více, oddělujeme je čárkou. Upravíme nyní naši metodu main():

Zdravic zdravic = new Zdravic();
zdravic.pozdrav("Karel");
zdravic.pozdrav("Petr");

Náš kód je nyní v metodě a my ho můžeme jednoduše pomocí parametrů volat znovu s různými parametry. Nemusíme 2x opisovat "Ahoj uživateli...". Kód budeme odteď dělit logicky do metod.

Konzolová aplikace
Ahoj uživateli Karel
Ahoj uživateli Petr

Třídě přidáme nějaký atribut, nabízí se text, kde bude uložen text pozdravu. Atributy se definují stejně, jako proměnné. Jako u metod platí, že před ně píšeme modifikátor přístupu, bez něj je Java bere jako private. Upravme naši třídu:

public class Zdravic {
        public String text;

        public void pozdrav(String jmeno) {
                System.out.printf("%s %s\n", text, jmeno);
        }

}

Text nyní musíme pochopitelně nastavit vytvořené instanci v HelloObjects.java:

Zdravic zdravic = new Zdravic();
zdravic.text = "Ahoj uživateli";
zdravic.pozdrav("Karel");
zdravic.pozdrav("Petr");
zdravic.text = "Vítám tě tu programátore";
zdravic.pozdrav("Richard");

Výsledek:

Konzolová aplikace
Ahoj uživateli Karel
Ahoj uživateli Petr
Vítám tě tu programátore Richard

Vzhledem k objektovému návrhu není nejvhodnější, aby si každý objekt ovlivňoval vstup a výstup, jak se mu zachce. Pochopitelně narážím na naše vypisování do konzole. Každý objekt by měl mít určitou kompetenci a tu by neměl překračovat. Pověřme náš objekt pouze sestavením pozdravu a jeho výpis si zpracujeme již mimo, v našem případě v metodě main(). Výhodou takto navrženého objektu je vysoká univerzálnost a znovupoužitelnost. Objekt doposud umí jen psát do konzole, my ho však přizpůsobíme tak, aby daná metoda text pouze vracela a bylo na jeho příjemci, jak s ním naloží. Takto můžeme pozdravy ukládat do souborů, psát na webové stránky nebo dále zpracovávat.

Jelikož chceme, aby metoda vracela hodnotu a to String, změníme její dosavadní typ void na String. K návratu hodnoty použijeme příkaz return. Return metodu ukončí a navrátí hodnotu, jakýkoli kód v těle metody po return se již neprovede! Upravme obě třídy:

Metoda pozdrav v Zdravic.java:

public String pozdrav(String jmeno) {
    return String.format("%s %s", text, jmeno);
}

Tělo metody main() v HelloObjects.java:

Zdravic zdravic = new Zdravic();
zdravic.text = "Ahoj uživateli";
System.out.println(zdravic.pozdrav("Karel"));
System.out.println(zdravic.pozdrav("Petr"));
zdravic.text = "Vítám tě tu programátore";
System.out.println(zdravic.pozdrav("Richard"));

Nyní je náš kód dle dobrých praktik. Ještě naši třídu okomentujme, jak se sluší a patří. Komentáře budeme psát nad název třídy a nad název každého atributu a metody. K jejich zápisu použijeme "/** Popisek */". Vyplatí se nám to ve chvíli, když na třídě používáme nějakou metodu, její popis se nám zobrazí v našeptávači. Zdokumentovaná třída může vypadat např. takto:

/** Třída reprezentuje zdravič, který slouží ke zdravení uživatelů */
public class Zdravic {
        /** Text pozdravu */
        public String text;

        /**
         * Pozdraví uživatele textem pozdravu a jeho jménem
         * @param  jmeno  Jméno uživatele
         * @return      Text s pozdravem
         */
        public String pozdrav(String jmeno) {
                return String.format("%s %s", text, jmeno);
        }

}

/* */ je víceřádkový komentář, syntaxe popisků se nazývá Javadoc. NetBeans umí Javadoc sám přidat do vašeho kódu, stačí ho pak jen vyplnit. Kliknete pravým na třídu v záložce Project a zvolíte Tools -> Analyze Javadoc, zaškrtáte chybějící políčka a potvrdíte tlačítkem. Z Javadoc umí Netbeans i generovat dokumentaci ve formátu HTML. Pokud budete své třídy dobře popisovat, programátorskou dokumentaci k aplikaci vytvoříte poté jediným kliknutím.

Podíváme se, že nám NetBeans opravdu popisky zobrazí:

Metody objektu zdravic v NetBeans

A jsme u konce. Námi napsaný program má již nějakou úroveň, i když vlastně nic nedělá. Za úkol máte předělat si naši konzolovou kalkulačku do objektů. Příště si uděláme takovou jednoduchou hříčku, necháme dva objekty (bojovníky) soupeřit v aréně (také objektu). Máte se na co těšit ;-)


 

Stáhnout

Staženo 1251x (18.09 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
27 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (7)

 

 

Komentáře
Zobrazit starší komentáře (60)

Avatar
Libor Šimo (libcosenior):30.12.2016 16:50

Miro, nerob z toho vedu. Vyskusaj co si sa doteraz naucil a tu kalkulacku naprogramuj. Urcite to zvladnes. ;-)

Odpovědět 30.12.2016 16:50
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Miroslav Melzer:31.12.2016 16:13

Koupil sem si článek cvičení a jde jen o tu první jednoduchou kalkulačku....a myslim, že sem to dokázal %P
Svoje řešení dam pod článek s cvičením...

 
Odpovědět  +1 31.12.2016 16:13
Avatar
Miroslav Melzer:4. ledna 14:51

Nějak nerozumim tomu že metoda nebude vracet žádnou hodnotu. Nějak nevim jak to poznat kdy použít void. Mě to připadá že se vždycky vrací nějaká hodnota....

 
Odpovědět 4. ledna 14:51
Avatar
Martin Halada:4. ledna 16:02

Nejdříve metoda žádnou hodnotu nevracela, jen do konzole vypisovala jméno a text. My jsme ale nechtěli aby metoda ovlivňovala výstup do konzole, proto jsme pověřili náš objekt pouze k sestavení pozdravu a jeho výpis jsme si zpracovali v metodě Main();

Odpovědět 4. ledna 16:02
Počítač je zařízení sloužící k řešení problémů, které by bez něj vůbec nevznikly.
Avatar
Michal Martinec:16. ledna 13:33

Ja nechapem len tomu ako mam pridat Javadoc do toho. Ked kliknem pravym na triedu ci uz zdravic alebo HelloObjects tak sice tam najdem tools a aj Analyze Javadoc, ale ked na to kliknem sa nic nestane. Ake chybajuce tlacitka mam zaskrkata akym tlacitkom potvrdit? :D z toho som uplne mimo lebo mi to nic nezobrazi a podla vsetkeho nieco robim zle.... Vie niekto poradit? :)

Odpovědět 16. ledna 13:33
Neporovnavaj sa s ostatnymi. Porovnavaj sa sam so sebou.
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Michal Martinec
pocitac770:16. ledna 14:27

Když například napíšeš novou metodu a neookomentuješ ji javadocem, tak přes Analyze Javadoc si můžeš nechat vygenerovat kostru javadocu pro tu metodu. Každé to políčko ti označuje nějaký problém, že jsi někdo něco neokomentoval, máš to vždy u toho popsáno (ano, je dobré se naučit anglicky, u programování spíše nutné), většinou 1 políčko = jeden prvek (metoda, třída, atribut,...). Hodí se to ale akorát, když toho potřebuješ udělat více najednou, pro normální psaní stačí naject na volný řádek nad metodou, napsat /**, dát enter a ono ti to vygeneruje přesně tu stejnou kostru, bez zbytečných dialogů.

 
Odpovědět  +1 16. ledna 14:27
Avatar
Odpovídá na pocitac770
Michal Martinec:16. ledna 14:35

Ja som si to sam cele vypisal cez /** tak asi preto to nic neurobilo lebo som to tam uz mal :) le nsom to zle pochopil. Tak dakujem teda :)

Odpovědět 16. ledna 14:35
Neporovnavaj sa s ostatnymi. Porovnavaj sa sam so sebou.
Avatar
Jan Miesbauer:3. března 16:33

Ahoj, potřeboval bych pomoc, snažím se předělat konzolovou kalkulačku do objektů a zasekl jsem se na jedné věci.

package objekt;
import java.util.Scanner;

public class Objekt {

public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.prin­tln("Vítejte v kalkulačce!");
String pokracovat = "ano";
while( pokracovat.equ­als("ano"))
{
menu();
}

public static void menu(){
Scanner in = new Scanner(System.in);
System.out.prin­tln("Vyberte si možnost: ");
System.out.prin­tln("1 - sčítání");
System.out.prin­tln("2 - odčítání");
System.out.prin­tln("3 - násobení");
System.out.prin­tln("4 - dělení");
int volba = Integer.parse­Int(in.nextLi­ne());
switch (volba ) {
case 1: scitani(); break ;
case 2: odcitani(); break;
case 3: nasobeni(); break;
case 4: deleni(); break;
case 5:
default: menu();
}
}

Java mi podtrhává public static void menu(). Nevíte někdo co mám předělat?
PS. zbytek kódu již mám dodělaný, jenom jsem sem nechtěl kopírovat všechny metody.
Díky za odpověď :)

 
Odpovědět 3. března 16:33
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Jan Miesbauer
pocitac770:4. března 0:15

Takhle to vypadá, že nemáš všechny složené závorky správně uzavřené (konec metody main), stejnak, může to být i něčím jiným, třeba mě nedává ten kód moc smysl, když se na něj koukám, právě proto, když kopíruješ kód z důvodu "něco mi nefunguje", tak by to chtělo celý kód (a ano, objektová kalkulačna na úrovni začátečníka OOP není dlouhá, představ si třeba 600 řádkový kód JEDNÉ TŘÍDY.... To jsem udělal někdy po skončení sekce OOP, a to je třeba už dlouhý kód, kde by byly potřeba vybrat pouze vhodné části :D ), případně je tu vždy možnost uložit kód někam stranou (příspěvek na fóru/dev-lighter na ITN/pastebin).

 
Odpovědět 4. března 0:15
Avatar
Jan Miesbauer:4. března 10:03

Díky moc už jsem to opravil a vše funguje :) Ohledně toho kódu nechtělo se mi to sem kopírovat všechno, protože jsem úplný začátečník a kód je tedy jistě zbytečně dlouhý (ale já jsem spokojený, hlavně, že to funguje)
a šel by na spoustě místech zkrátit... Na druhou stranu 600 řádků jsem opravdu nepopsal :D

 
Odpovědět 4. března 10:03
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 70. Zobrazit vše