BF Summer sales
Pouze tento týden sleva až 80 % na HTML & CSS a JavaScript
80 % bodů zdarma na online výuku díky naší Letní akci!

Lekce 2 - První objektová aplikace v Javě - Hello object world

Minulá lekce, Úvod do objektově orientovaného programování v Javě, nás uvedla 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])
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

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 package-private, viz dále v kurzu. 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ů.

V následujícím cvičení, Řešené úlohy k 2. lekci OOP v Javě, si procvičíme nabyté zkušenosti z předchozích lekcí.


 

Stáhnout

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

 

Předchozí článek
Úvod do objektově orientovaného programování v Javě
Všechny články v sekci
Objektově orientované programování v Javě
Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
52 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 sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity (16)

 

 

Komentáře

Avatar
karrrolina
Člen
Avatar
karrrolina:18.3.2013 15:40

První spuštění proběhlo, až když jsem ve třídě HelloObjects do parametru metody zdravic() vepsal null:
Zdravic zdravic = new Zdravic();
zdravic.pozdrav(nu­ll);

 
Odpovědět
18.3.2013 15:40
Avatar
karrrolina
Člen
Avatar
karrrolina:18.3.2013 15:41

... chtěl jsem říct metody pozdrav()

 
Odpovědět
18.3.2013 15:41
Avatar
Honza Bittner
Redaktor
Avatar
Odpovídá na karrrolina
Honza Bittner:18.3.2013 15:44

jo ... když jsi napsala null znamená že neodesíláš žádné jméno .. napiš místo null třeba "Pepa"

Odpovědět
18.3.2013 15:44
Student FIT ČVUT. In love with Flutter. :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://g...
Avatar
karrrolina
Člen
Avatar
karrrolina:18.3.2013 15:56

Plus ve třídě Zdravic je třeba do kulatých závorek vepsat (String cokoli), nenechávat je prázdné (eclipse bez argumentu dává syntaktickou chybu):


package helloobjects;

class Zdravic
{
public void pozdrav(String text)
{
System.out.prin­tln("Hello object world!");
}
}

 
Odpovědět
18.3.2013 15:56
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na karrrolina
David Čápka:18.3.2013 15:58

Nepostupuješ přesně podle tutorálu, jak to tu je napsané, tak to funguje.

Odpovědět
18.3.2013 15:58
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Зайчик
Člen
Avatar
Odpovídá na karrrolina
Зайчик:18.3.2013 16:01

omg se mi snad zdáš

public class Pozdrav
{
    public Pozdrav(String jmeno){
       System.out.println("Ahoj " + jmeno + ", přečti si článek ještě jednou!");
    }
}
public class Main
{
    public static main(String[] neco){
    new Pozdrav("Karolíno");
    }
}

Výstup : Ahoj Karolíno, přečti si článek ještě jednou!

Editováno 18.3.2013 16:02
Odpovědět
18.3.2013 16:01
Коммунизм для нашего будущего!
Avatar
Simon
Člen
Avatar
Simon:11.5.2013 13:22

Kájo jde jen o to,že ty máš vlastní metodu "pozdrav" s parametrem Stringu jmeno. Samotná metoda pozdrav vypíše do konzole "Ahoj uživateli jmeno". Když pak přes třídu zdravic voláš metodu pozdrav, bude vyžadován samozřejmě i parametr metody, čímž je ono jmeno.
Proto závorky nemohou být prázdné, buď zadáš jakýkoli textový řětězec v uvozovkách (něčí jméno) nebo necháš parametr null.

 
Odpovědět
11.5.2013 13:22
Avatar
Simon
Člen
Avatar
Odpovídá na Honza Bittner
Simon:11.5.2013 13:33

V tomto případě, když necháme parametr null, se mi vypíše do konzole "Ahoj uživateli null". null samozřejmě nemám v uvozovkách. Byl jsem trochu udiven, že ve výstupu konzole je jako jméno bráno null. Myslel jsem si přesně to samé jako HoBi, že null nevrací žádnou hodnotu...

 
Odpovědět
11.5.2013 13:33
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Simon
David Čápka:11.5.2013 17:14

V C# tomu tak je, v Javě se vypíše jako null.

Odpovědět
11.5.2013 17:14
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
dolakdavid
Člen
Avatar
dolakdavid:20.9.2013 13:02

Zdravím. Když se snažím v netbeans oddělovat parametry čárkou, hlásí se po spuštění chyba. Problém jsem vyřešil sečtením hodnot, co ale u parametrů tipu int? Nevíte někdo čím to může být?

 
Odpovědět
20.9.2013 13:02
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na dolakdavid
David Čápka:20.9.2013 13:08

Tvůj dotaz nemá nic společného s článkem, pod který jsi ho napsal. Neobsahuje také ani ukázku kódu, která ti nejde. Pokud máš problém s takovými základy jako jsou spojování řetězců, tak si přečti zdejší základní seriál pro Javu.

Odpovědět
20.9.2013 13:08
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
dolakdavid
Člen
Avatar
dolakdavid:20.9.2013 13:13

Omlouvám se, tady je část kodu která hlasí chybu.(Když je mezi textem v uvozovkách a parametrem jmeno čárka)

public class Zdravic {
public void pozdrav(String jmeno)
{
System.out.prin­tln("Ahoj uživateli ", jmeno);
}

 
Odpovědět
20.9.2013 13:13
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na dolakdavid
David Čápka:20.9.2013 13:16

A kde jsi přišel na to, že se v println čárkuje? Musíš vše spojit do jednoho řetězce pomocí operátoru plus. Funguje to i pro čísla, které se na text implicitně převedou.

Editováno 20.9.2013 13:16
Odpovědět
20.9.2013 13:16
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na dolakdavid
Kit:20.9.2013 13:17
public void pozdrav(String jmeno) {
    System.out.println("Ahoj uživateli " + jmeno);
}

nebo

public void pozdrav(String jmeno) {
    System.out.print("Ahoj uživateli ");
    System.out.println(jmeno);
}

Častější je však spojení řetězců operátorem "+".

Odpovědět
20.9.2013 13:17
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:20.9.2013 13:20

Funguje to nejen pro čísla, ale i pro všechny objekty. Nejlepšího efektu je možné docílit, pokud překryješ metodu toString() svým vlastním výstupem.

Odpovědět
20.9.2013 13:20
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Libor Šimo (libcosenior):20.9.2013 15:08

Ešte si zabudol na poslednú možnosť. ;)

public void pozdrav(String jmeno)
{
        System.out.printf("Ahoj uživateli %s", jmeno);
}
Odpovědět
20.9.2013 15:08
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Libor Šimo (libcosenior)
Kit:20.9.2013 15:49

Když už, tak takhle:

public void pozdrav(String jmeno) {
    System.out.format("Ahoj uživateli %s%n", jmeno);
}
Odpovědět
20.9.2013 15:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Libor Šimo (libcosenior):20.9.2013 16:32

%n je odriadkovanie? Teda ako \n?

Odpovědět
20.9.2013 16:32
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovědět
20.9.2013 16:44
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Libor Šimo (libcosenior)
Kit:20.9.2013 16:45

%n je je jiné odřádkování než \n. Je závislé na prostředí, ve kterém program běží. V každém prostředí odřádkuje správně.

Odpovědět
20.9.2013 16:45
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Leo
Neregistrovaný
Avatar
Leo:13.10.2013 11:23

Neni mi moc jasne jaky vyznam ma konstrukce
public static void main(String [] args)
a nikde to tady v clanku nevidim. Pritom to bez toho nefunguje.
Proc tam musi byt metoda main a nac jsou tam String[] a Args.
Dekuji.

 
Odpovědět
13.10.2013 11:23
Avatar
Kit
Redaktor
Avatar
Odpovídá na Leo
Kit:13.10.2013 11:32

Statická metoda main() je určena pro spouštění aplikace. Jako parametr obdrží od systému pole stringů args.

Odpovědět
13.10.2013 11:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Leo
Neregistrovaný
Avatar
Odpovídá na Kit
Leo:15.10.2013 10:59

Diky Kite.
A jenom jeste par veci.
v cmd okne nemam zadnou cestu k Jave...kdyz dam path. Nefunguje mi javac prikaz. Mam stazene nejake knizky z netu kde ze zacatku nepouzivaji IDE ale jenom jednodochy editor kompiluji pres javac, spousteji prikazem java. To mi rozhodne nefunguje. V IDE
(Eclipse) to nejak v terminal okne funguje.

 
Odpovědět
15.10.2013 10:59
Avatar
Kit
Redaktor
Avatar
Odpovídá na Leo
Kit:15.10.2013 12:38

Tak to ti musí poradit někdo jiný. Nepoužívám cmd ani Eclipse. Mělo by ti však fungovat klasické spouštění

java Program

Přípona class se neuvádí.

Odpovědět
15.10.2013 12:38
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Leo
David Čápka:15.10.2013 13:14

Význam konstrukce ti bude jasný až dočteš seriál, není možné ho v prvních dílech vysvětlit, jelikož s tím souvisejí pokročilé věci. IDE určitě používej, bez něj se v praxi neprogramuje.

Odpovědět
15.10.2013 13:14
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:15.10.2013 13:41

Jasně, bez IDE programují pouze rebelové jako já :)

Odpovědět
15.10.2013 13:41
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Luboš Běhounek Satik
Autoredaktor
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:15.10.2013 14:19

Nevím, jestli rebel nebo spíš masochista :)

Odpovědět
15.10.2013 14:19
https://www.facebook.com/peasantsandcastles/
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:15.10.2013 14:21

Vím, že s IDE se dají programy prasit mnohem rychleji, ale mně to tak vyhovuje.

Odpovědět
15.10.2013 14:21
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Luboš Běhounek Satik
Autoredaktor
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:15.10.2013 15:30

IDE ti často pomáhá s tím, aby jsi neprasil tolik :)

Editováno 15.10.2013 15:30
Odpovědět
15.10.2013 15:30
https://www.facebook.com/peasantsandcastles/
Avatar
Kit
Redaktor
Avatar
Odpovídá na Luboš Běhounek Satik
Kit:15.10.2013 15:43

Jako vtip dobré, ale nejlepším receptem proti prasení je TDD. IDE hraje jen minimální roli a záleží jen na kvalitě programátora, zda je ta role pozitivní či negativní.

Odpovědět
15.10.2013 15:43
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Luboš Běhounek Satik
Autoredaktor
Avatar
Odpovídá na Kit
Luboš Běhounek Satik:15.10.2013 18:49

<irony>Ano, TDD je bůh a prasokód už pak člověk nenapíše.</irony>

Odpovědět
15.10.2013 18:49
https://www.facebook.com/peasantsandcastles/
Avatar
lm3951
Člen
Avatar
lm3951:11.11.2013 15:35

ahoj,

pre mna najdolezitejsia vec v tomto clanku vysvetlena nie je.
Kde musi byt metoda main, zdoraznujem neviem kde MUSI byt nie kde moze.
Takze na zaklade pokusov viem, ze ked ju nedam do triedy HelloObjects tak to nefunguje, v zdravic nemusi byt. Je to tak naozaj ? Ze v triedach ktore sluzia len na definiciu main netreba. Jedine kde musi byt je cast kde je program v ktorom vytvaram objekty /instancie tried ? t.j v tomto pripade v triede HelloObejcts ? Takze mozem mat 1000 tried a main tam nebude, ale v programe kde to vsetko instancujem tak musi ? alebo ako je to presne.
dakujem.

 
Odpovědět
11.11.2013 15:35
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na lm3951
Jan Vargovský:11.11.2013 15:51

Je jedno kde je, prostě někde v těch souborech musí být static void Main(string[] args)

 
Odpovědět
11.11.2013 15:51
Avatar
lm3951
Člen
Avatar
Odpovídá na Jan Vargovský
lm3951:11.11.2013 17:10

hmm nieco som nasiel, podla toho ma byt v tej triede, ktorou sa spusta cely program. Ze moze byt v hociktorej triede mi pride ako dost nestastne riesenie, to potom nahodou nejaku triedu proste nepouzijes /vymazes/ a zrazu ti prestane cely kod fungovat. Ked tam mas 50 tried to musi byt asi dost bordel ak by bola metoda main v nejakej nepodstatnej.
Neverim, ze ludia co pisu aplikacie kde je viacej tried tak nemaju v tomto nejaky system.

 
Odpovědět
11.11.2013 17:10
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na lm3951
Jan Vargovský:11.11.2013 17:19

Nevím zaco to i--, ale obhájím to co jsem řekl. Máš v projektu 100 tříd a je jedno kde je metoda Main, někde v těch souborech musí být. Platí ale, že může být jen jedna a je celkem logické, že když voláš nějaké metody z instancí tak se program musí vrátit do té hlavní metody a ta je vždycky Main.

A proč problém ? Od toho máš IDE, aby ti pomáhalo i kdybych ti schoval mainmetodu mezi miliardu tříd, měl bys schopen využít IDE tak, aby jsi jí našel do 5ti sekund.

Defaultně je třída Program a metoda Main. Není důvod to měnit a dávat to někde jinde.

 
Odpovědět
11.11.2013 17:19
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na lm3951
David Čápka:11.11.2013 17:24

Proč by měla být metoda main popsaná v objektovém seriálu, když s tvořenými objekty vůbec nesouvisí? Main je základní metoda, kterou ti vygeneruje IDE u nového projektu a je tam vždy od začátku a vždy jen jedna. Pokud ti to není jasné, udělej si seriál se základy syntaxe Javy, který tomuto seriálu předchází.

Odpovědět
11.11.2013 17:24
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
lm3951
Člen
Avatar
Odpovídá na David Čápka
lm3951:11.11.2013 17:35

ja som si to cele presiel a urobil som si aj vsetky priklady.
To, ze nieco mi vygeneruje IDE je fajn, ale ked neviem ako to presne funguje nie je to pre mna pochopitelne riesenie specialne pri oop.
Predsa aj ked to budem pisat v notepade tak musim vediet co robim.

takze este raz.
Ak v priklade, ktory je hned na zaciatku dam metodu main do Zdravic.java tak eclips mi vyhadzuje chybu. Ak chcem, aby to zbehlo tak metoda main musi byt v HelloObjects.java a v nej vytvoreny objekt zdravic.
Takze v tomto pripade mi nejak nefunguje ani to, ze moze byt hocikde.

 
Odpovědět
11.11.2013 17:35
Avatar
Kit
Redaktor
Avatar
Odpovídá na lm3951
Kit:11.11.2013 17:40

Metodu main() mám v každé třídě. Zjistil jsem, že je to tak nejlepší.

Odpovědět
11.11.2013 17:40
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na lm3951
Jan Vargovský:11.11.2013 17:42

Tohle je objektový tutoriál pro lidi, kteří znají základní věci. Je jedno v jaké třídě je ta metoda Main, pak ale musíš zbytek programu dohodit do společně s tou metodou. Když si snad přejmenuješ název vygenerované třídy, kde je metoda main tak program nefunguje?

Btw, co třeba říct jakou chybu?

 
Odpovědět
11.11.2013 17:42
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na lm3951
David Čápka:11.11.2013 17:43

Ty jsi to vůbec nepochopil. Zdravic.java je třída, která reprezentuje objekt zdraviče. Je to tu vysvětlené. Main je spouštěcí metoda v hlavní třídě aplikace, pracuje se s ní asi 15 předchozích dílů, tak jestli jsi je četl, měl bys to vědět.

Odpovědět
11.11.2013 17:43
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Michal Říčan (fussak):11.11.2013 17:47

Jestli chceš odpověď, kde přesně musí být umístěna metoda main(). Tak se to většinou dá dohledat někde v nastavení projektu.

Když vytváříš nový projekt, tak se ti defaultně vygeneruje třída obsahující metodu main(). A cesta ( název třídy ) kde se metoda nachází je taky nastavena defaultně. Nepoužívám eclipse ale NetBeans, tam se to dá dohledat ( Run > Set project config > Customize.. ), položka main class. Když si ji změníš například na start.Zdravic, překladač bude hledat metodu main() ve třídě Zdravic

Asi nikoho nenapadlo, když nějaké IDE atd. programoval, že ještě před spuštěním překladu by měl prohledat všechny zdrojové kódy aby zjistil kam mu uživatel umístil main().

Snad je toto odpověď na tvou otázku.

 
Odpovědět
11.11.2013 17:47
Avatar
lm3951
Člen
Avatar
Odpovídá na David Čápka
lm3951:11.11.2013 20:18

sdraco - nerozumieme si nejak. Vysvetlujes to super a tvoj tutorial som presiel komplet. Vdaka.
Ja viem co a naco je metoda main a ked som pisal program proceduralne, tak mi neprislo nijak divne, ze tam je a ze je nou obaleny cely kod.

Ja som sa, ale teraz pri oop pytal, ze v ktorej triede ju NEMUSIM uviest ked pouzivam objekty. Odpoved davaj ju vsade nie je odpoved na to co ma zaujima.

A eclipse ti default nevklada do vytvoreneho class metodu main, iba ak si to zvolis ako moznost pre ten konkretny class.

Takto to chodi samozrejme v pohode.
HelloObjects.java

package helloobjects;

public class HelloObjects{

        public static void main (String[] args)
        {

        Zdravic zdravic = new Zdravic();

        zdravic.pozdrav();

        }

}

Zdravic.java

package helloobjects;

public class Zdravic
{


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


}

ked main vlozim do triedy zdravic

package helloobjects;



public class Zdravic
{

        public static void main (String[] args){


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

   }
}

a vymazem z triedy HelloObjects

package helloobjects;

public class HelloObjects{


        Zdravic zdravic = new Zdravic();

        zdravic.pozdrav();

}

tak aj napriek tomu, ze mi tvrdite, ze to je jedno kde je main, tak to nefunguje, takze ? Kde robim chybu ?

Editováno 11.11.2013 20:21
 
Odpovědět
11.11.2013 20:18
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na lm3951
David Čápka:11.11.2013 20:23
  1. Na vložení zdrojových kódů je zde tlačítko.
  2. Metodu si tam vložil špatně, proto to nefunguje. Nemůžeš mít metodu v metodě.
  3. Pokud čteš seriál, kde se pracuje s NetBeans, tak je lepší pracovat s NetBeans, je to i hlavní IDE pro Javu přímo od Oracle. Chápu, že třeba potřebuješ používat Eclipse, ale přejdi až ve chvíli, kdy to budeš umět.
Odpovědět
11.11.2013 20:23
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na lm3951
Jan Vargovský:11.11.2013 20:31
package helloobjects;

public class HelloObjects{


       Zdravic zdravic = new Zdravic();

       zdravic.pozdrav();

}

Tohle je co ?

 
Odpovědět
11.11.2013 20:31
Avatar
lm3951
Člen
Avatar
Odpovídá na David Čápka
lm3951:11.11.2013 20:50
  1. ok
  2. ok
  3. ok

nasiel som si to teda na nete. main MUSI byt LEN v triede, ktoru spusta interpreter ako prvu. V zasade by nikde inde byt nemusela /iba ak sa testuje nejaka trieda /. Bez IDE nejak ako napr. java MenoTriedy potom sa zavola metoda main z tejto triedy inde byt nemusi.

 
Odpovědět
11.11.2013 20:50
Avatar
vfsdfsdfdsf
Člen
Avatar
vfsdfsdfdsf:10.1.2014 17:39

Ahoj, jakto že v tom příkladu, co napsal uživatel Зайчик v komentářích, se po vytvoření instance třídy Pozdrav automaticky zavolá i jeho metoda se stejným názvem? To dělá nějak implicitně konstruktor?

 
Odpovědět
10.1.2014 17:39
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá na vfsdfsdfdsf
Jan Vargovský:11.1.2014 21:26

To není metoda, ale pouze konstruktor. Podívej se jak se píše konstruktor a metoda - u jedné chybí návratový typ.

 
Odpovědět
11.1.2014 21:26
Avatar
vfsdfsdfdsf
Člen
Avatar
Odpovídá na Jan Vargovský
vfsdfsdfdsf:12.1.2014 11:38

Jojo díky, kdybych si předtím přečetl další kapitolu, nemusel bych se ptát :D

 
Odpovědět
12.1.2014 11:38
Avatar
Marcel Smolik:4.7.2015 11:13

Dobrý den mohl bych se zeptat co jsou tyhle znaky- %s
vým že je to asi někde v základech ale nemohu to najít.

 
Odpovědět
4.7.2015 11:13
Avatar
Ondřej Štorc
Redaktor
Avatar
Odpovídá na Marcel Smolik
Ondřej Štorc:4.7.2015 12:53

http://www.itnetwork.cz/…-typy-string
Skoro u konce článku je to popsaný (nadpis té 'sekce' je Format)

Odpovědět
4.7.2015 12:53
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Richard H.
Redaktor
Avatar
Richard H.:7.8.2015 12:28

Zajímavá náhoda já jsem Richard

Odpovědět
7.8.2015 12:28
Malý užitečný manuál je vždy lepší než bichle k ničemu.
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:5.12.2015 21:58

Jen pro upřesnění:

metoda je činnost, kterou program dělá PO JEJÍM ZAVOLÁNÍ!! pokud tedy metodu nezavoláme, je naprosto jedno, jak dokonalý kód je v ní napsaný. V OOP jde vlastně pouze o volání metod, samotný kód, který v metodě není v objektových jazycích neexistuje (překladače je automaticky vyhodnotí jako chybu - viz komentář uživatele lm3951:

public class HelloObjects{
       Zdravic zdravic = new Zdravic();
       zdravic.pozdrav();
}

Všechno musí být v metodách. O tom jaké máme metody budou snad další články, ale takové základní rozdělení je. Prázdné, Návratové, Konstruktory
Potom mohou být statické, veřejné a soukromé, ale to teď není důležité.
Prázdná metoda:

public void metoda(){
}

Návratová metoda:

public int metoda(){
        return 5;
}
public String metoda(){
        return "tukan";
}
public boolean metoda(){
        return true;
}

atd.
Pak je speciální typ metody - konstruktor. (jsou 4 druhy konstruktorů: implicitní, bezparametrický, parametrický a privátní) o tom jaký je mezi nimi rozdíl není tento článek, proto je pouze vypisuji.
Konstruktor narozdíl od metody nemá žádný datový typ (ani prázdný - void). Navíc název konstruktoru MUSÍ být stejný jako je název třídy.

public class Test{      //vytvoření a název třídy (třída Test)
        public Test(){  //toto je konstrutor. Když se třída jmenuje Test, muse se takto jmenovat i konstrutor
        }
}

No a metoda main? (kvůli které toto píšu:D)
Jak jsem psal na začátku - OOP je vlastně volání metod příslušných tříd. Jenže aby se vůbec nějak program rozjel, musí se zavolat metoda main, která je v Javě takhle daná. Tudíž, zapamatujte si, že metoda:

public static void main(String[] args){

}

spouští program. Pokud je metoda main ve více třídách (může být), tak musíme vybrat, kterou bude program brát za spouštěcí. Potom jsou ty ostatní opravdu zbytečné, ale můžou tam být.

Pokud jde o toto: "metoda main může být kdekoliv", tak ano, může být, ale už logicky z toho tedy vyplývá, že pokud ji dáme do "nehlavní" třídy, tak se z ní musíme komplikovaně dostávat ven.
příklad: máme 3 třídy. Plocha, Piskvorek, Hodnoceni. Logicky bychom dali main metodu do třídy Plocha, protože na plochu nakreslíme pole čtverečků, budeme provádět logiku hry apod. Pokud bychom dali metodu main do třídy Piskvorek, tak bychom museli z ní stejně zavolat:

Plocha plocha = new Plocha();

Ale trošku to postrádá přehlednost. A v situaci, kdy máme takových tříd 200 a ne jen 3, tak hledejme proč není metoda main logicky v hlavní třídě, ale ve třídě, kterou hlavní třída dočasně, okrajově nebo dokonce pomocně využívá. To už potom píše kód prase a ne človíček:)

Odpovědět
5.12.2015 21:58
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Nezmar Hydra
Člen
Avatar
Nezmar Hydra:17.5.2016 2:26

Moc děkuji za krásně zpracovaný kurz. A budu mít jednu úplně pitomou otázku. Kde nastavím zobrazování popisků? Nezobrazují se mi u žádného ani staženého projektu. Děkuji.

Editováno 17.5.2016 2:27
 
Odpovědět
17.5.2016 2:26
Avatar
Nezmar Hydra
Člen
Avatar
Odpovídá na Nezmar Hydra
Nezmar Hydra:17.5.2016 3:11

Tak nic .... už jsem to uklikal :-)

Editováno 17.5.2016 3:11
 
Odpovědět
17.5.2016 3:11
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
David Capoušek:27.11.2016 12:49

Nedal by sem někdo zdroják tý objektový kalkulačky, prosím?

 
Odpovědět
27.11.2016 12:49
Avatar
Miroslav Melzer:28.12.2016 16:31

Jenom takovou drobnost... mě to neodřádkuje

public class Zdravic {

   public void pozdrav (String jmeno){
       System.out.printf("Vítej uživateli jménem %s", jmeno);
Zdravic zdravic = new Zdravic();
        zdravic.pozdrav("Karel");
        zdravic.pozdrav("Jaroslav");

Chybí tam to \n za tim %s, nebo mam něco blbě já ?

 
Odpovědět
28.12.2016 16:31
Avatar
Odpovídá na Miroslav Melzer
Libor Šimo (libcosenior):28.12.2016 16:59

Schvalne, co si o tom myslis?

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

Myslim, že to tam chybí.

 
Odpovědět
28.12.2016 19:14
Avatar
Miroslav Melzer:30.12.2016 16:07

Já to nějak nechápu :-? S tou kalkulačkou je to jenom vtip, že jo ?
Zatim se mi podařilo ten zdravič malinko modifikovat...

/** Tříde ke zdravení*/
public class Zdravic {
    /** text pozdravu*/
    public String text;
    /** pozdraví už. jménem a textem
     *
     * @param jmeno Jmeno už.
     * @param vek   Věk už.
     * @return  text s pozdravem
     */
    public String pozdrav(String jmeno, int vek){
        return String.format("%s %d letý %s",text,vek,jmeno);

=============­========================­==============

public static void main(String[] args) {

         Scanner sc = new Scanner(System.in, "Windows-1250");

        Zdravic zdravic = new Zdravic();

        zdravic.text = "Ahoj uživateli";
        System.out.println(zdravic.pozdrav("Miroslave", 41));
        zdravic.text = " Zadej první číslo";
        System.out.println(zdravic.pozdrav ("Josefe",55));
        float a = Float.parseFloat(sc.nextLine());

=============­========================­=======
Pro kalkulačku, ten scaner, jak ho tam dostanu ? "Postaru" importem nebo už jako metodu?
To "new scanner" vypadá jako "new Zdravic" ... Může tam vůbec být víc metod ? Bude mít každá svůj return ? Jak bude vypadat return pro float? A co ty početní operace a jak ten cyklus pro opakování... Mi neřikejte, že ste někdo už po týhle lekci tu kalkulačku zmáknul... :-O

 
Odpovědět
30.12.2016 16:07
Avatar
Odpovídá na Miroslav Melzer
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
31.12.2016 16:13
Avatar
Miroslav Melzer:4.1.2017 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.1.2017 14:51
Avatar
Martin Halada:4.1.2017 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.1.2017 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.1.2017 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.1.2017 13:33
Neporovnavaj sa s ostatnymi. Porovnavaj sa sam so sebou.
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Michal Martinec
pocitac770:16.1.2017 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
16.1.2017 14:27
Avatar
Odpovídá na pocitac770
Michal Martinec:16.1.2017 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.1.2017 14:35
Neporovnavaj sa s ostatnymi. Porovnavaj sa sam so sebou.
Avatar
Jan Miesbauer:3.3.2017 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.3.2017 16:33
Avatar
pocitac770
Redaktor
Avatar
Odpovídá na Jan Miesbauer
pocitac770:4.3.2017 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.3.2017 0:15
Avatar
Jan Miesbauer:4.3.2017 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.3.2017 10:03
Avatar
Filip (animátor/programator):6.9.2017 17:15

Moja verzia oop kalkulačky v jave
main:

package oop.kalkulacka;

import java.util.*;
/**
 *
 * @author My
 */
public class OopKalkulacka {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Scanner sc = new Scanner(System.in, "Windows-1250");

        operacia operacia = new operacia();

        System.out.println("vitajte v kalkulačke");
         System.out.println("zadajte prve číslo");
         float a = Float.parseFloat(sc.nextLine());
         System.out.println("zadajte druhe číslo");
         float b = Float.parseFloat(sc.nextLine());
          System.out.println("zvolte si operáciu");
         System.out.println("číslo 1 sčítanie");
         System.out.println("číslo 2 odčítanie");
         System.out.println("číslo 3 násobenie");
         System.out.println("číslo 4 delenie");
         int op = Integer.parseInt(sc.nextLine());
    operacia.operacia(op, a, b);

    }
}

operacia:

package oop.kalkulacka;

/**
 *
 * @author My
 */
public class operacia {

    public void operacia(int op,float a,float b){
    plus plus = new plus();
    minus minus = new minus();
    krat krat = new krat();
    deleno deleno = new deleno();
    if (op == 1){
    plus.plus(a, b);
    }
    else
        if (op == 2){
    minus.minus(a, b);
    }
    else
            if (op == 3){
    krat.krat(a, b);
    }
    else
                if (op == 4){
    deleno.deleno(a, b);
    }
                else
                    System.out.println("Neplatná volba");

    }

}
Editováno 6.9.2017 17:17
Odpovědět
6.9.2017 17:15
Nikdy sa nevzdávaj a choď si za svojim snom.......
Avatar
Radka Jánská:23.9.2017 21:51

Ahoj, tak bych s vámi ráda zkonsultovala moje řešení jednoduché kalkulačky OOP. Vycházela jsem z toho, že znovupoužitelnost bych ocenila u samotného výpočtu. Vytvořila jsem tedy samostatnou třídu Kalkulacka pro deklaraci proměnných (cislo1, cislo2 a volba) - jako atributy - a pro samotný výpočet operace s proměnnými - jako metodu. V metodě main jsem nechala vše, co se týká "prostředí kalkulačky" - tedy uvítání, způsob výzvy k zadání čísel a výběru operace, způsob prezentace výsledku.

Co jsem nedokázala pořešit bylo ošetření zadání operace jiné než 1 až 4 přímo v Kalkulačce, musela jsem to nechat v main, což není zrovna ideální řešení. Zkoušela jsem přijít na to, jak rozšířit syntaxi za příkazem return, ale zatím se mi to nepovedlo. Máte někdo nějakou radu?

TŘÍDA KALKULACKA:

/**
* Třída umožňuje výpočet pro dvě čísla a s přednastavené operace (+, -, *, /).
* @author janska
*/
public class Kalkulacka {

/**
* První číslo ve výpočtu (při rozdílu číslo, od kterého se odčítá, při dělení čitatel).
*/
public float cislo1;

/**
* Druhé číslo ve výpočtu (při rozdílu číslo, kterého se odčítá, při dělení jmenovatel).
*/
public float cislo2;

/**
* Volba operace, která se má s čísly provést:
* 1 - sčítání,
* 2 - odčítání,
* 3 - násobení,
* 4 - dělení.
*/
public int volba;

/**
* Metoda provádějící výpočet operace.
* V případě, že volba není 1 až 4, vrátí výpočet hodnotu 0.
* @return
*/
public float vypocet() {
float vysledek = 0;

switch(volba)
{
case 1:
vysledek = cislo1 + cislo2;
break;
case 2:
vysledek = cislo1 - cislo2;
break;
case 3:
vysledek = cislo1 * cislo2;
break;
case 4:
vysledek = cislo1 / cislo2;
break;

}
return vysledek;
}
}

METODA MAIN:

public static void main(String[] args) {
Scanner sc = new Scanner(System.in, "Windows-1250");
Kalkulacka kalkulacka = new Kalkulacka();

System.out.prin­tln("Vítejte v kalkulačce");

String pokracovat = "ano";
while(pokraco­vat.equals("a­no"))
{
System.out.prin­tln("Zadejte první číslo:");
kalkulacka.cislo1 = Float.parseFlo­at(sc.nextLine());
System.out.prin­tln("Zadejte druhé číslo:");
kalkulacka.cislo2 = Float.parseFlo­at(sc.nextLine());
System.out.prin­tln("Zvolte si operaci:\n\t 1 - sčítání,\n\t 2 - odčítání,\n\t 3 - násobení,\n\t 4 - dělení");
kalkulacka.volba = Integer.parse­Int(sc.nextLi­ne());
if ((kalkulacka.volba > 0) && (kalkulacka.volba < 5))
{
System.out.prin­tln("Výsledek: " + kalkulacka.vy­pocet());
}
else
{
System.out.prin­tln("Neplatná volba");
}
System.out.prin­tln("Přejete si zadat další příklad? [ano/ne]");
pokracovat = sc.nextLine();
}
System.out.prin­tln("Děkuji za použití kalkulačky");
}

 
Odpovědět
23.9.2017 21:51
Avatar
Odpovídá na Radka Jánská
Ing. Petr Štechmüller:24.9.2017 7:51

Ahoj,

  1. Pro vložení kódu je tu tlačítko vložit kód.
  2. Konstrukce switch má ještě defaultní větev, do které se kód dostane, pokud není splněna ani jedna podmínka v case případech. Tudíž můžeš kód v metodě vypocet upravit takto:
switch(volba)
{
  case 1:
    vysledek = cislo1 + cislo2;
    break;
  case 2:
    vysledek = cislo1 - cislo2;
    break;
  case 3:
    vysledek = cislo1 * cislo2;
    break;
  case 4:
    vysledek = cislo1 / cislo2;
    break;
  default:
  // zde osetris nespravne znaménko
  // já osobně bych vyhodil nějakou výjimku typu IllegalArgumentException.

}
return vysledek;

3. Nemusís si ukládat výsledek operace do proměnné, ale rovnou ho vracet.

vysledek = cislo1 * cislo2; // tvůj přístup
return cislo1 * cislo2; // můj návrh

4. Přistupovat k atributům třídy přímo není úplně dobré. Na to by měly sloužit gettery a settery.

Přeji hodně úspěchu v učení...

Odpovědět
24.9.2017 7:51
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Bertram
Člen
Avatar
Odpovídá na Radka Jánská
Bertram:24.9.2017 11:33

Hádanka, proč se tvá kalkulačka dostala k takovému výsledku?

Vítejte v kalkulačce
Zadejte první číslo:
2.1
Zadejte druhé číslo:
1.1
Zvolte si operaci:
         1 - sčítání,
         2 - odčítání,
         3 - násobení,
         4 - dělení
2
Výsledek: 0.9999999
Přejete si zadat další příklad? [ano/ne]
 
Odpovědět
24.9.2017 11:33
Avatar
Odpovídá na Ing. Petr Štechmüller
Radka Jánská:25.9.2017 21:31

Ahoj, děkuji za reakci.

  1. Super, nevěděla jsem jak to tam vložit, už jsem to tlačítko našla a otestovala, jak funguje.
  2. Větev default znám, ale nevěděla jsem, jak do proměnné vysledek uložit String "Neplatná volba". V jednom z dalších tutoriálů jsem se teď setkala s tím, že je příkaz return použit vícekrát v rámci podmínky if, tak to zkusím napasovat na switch, jestli to dokážu rozchodit. :-)
  3. To navazuje na dvojku, nevěděla jsem, že return lze použít víckrát, tak mi drž palce, ať to napasuju. :-D
  4. Absolutně nevím o čem mluvíš, snad se k tomu dostanu v dalších tutoriálech, případně později při dalším studiu. :-D

Těším se na další podnětné reakce k mým dotazům. ;-)

 
Odpovědět
25.9.2017 21:31
Avatar
Odpovídá na Bertram
Radka Jánská:25.9.2017 21:32

Krutá hádanka, z hlavy nevím, jdu hledat. :-( Asi budu muset příště lépe testovat :-(

 
Odpovědět
25.9.2017 21:32
Avatar
Odpovídá na Bertram
Radka Jánská:25.9.2017 21:41

Týká se to hádám datového typu? Vím, že v tutoriálu o datových typech se psalo něco o problémy se zaokrouhlováním ... kvůli tomu je i speciální datový typ pro měnu, která by tyhle problémy měla ošetřit ... BigDecimal, nebo tak nějak, že? Mířím správným směrem nebo jsem mimo mísu?

 
Odpovědět
25.9.2017 21:41
Avatar
Radka Jánská:25.9.2017 21:58

Ahoj všem, napadl mne ještě jeden dotaz, možná hloupý, ale vrtá mi to hlavou. :-D Jde mi o grafické znázornění OOP - members v IDe... kolečko (koule?) jsou metody, čtvereček (krychle?) jsou atributy ... co je kosočtvereček (jehlan?) :-D

 
Odpovědět
25.9.2017 21:58
Avatar
Bertram
Člen
Avatar
Odpovídá na Radka Jánská
Bertram:25.9.2017 23:10

Jde o to, že pro každý datový typ je v paměti vyhrazen určitý prostor. V javě je to pro float 32 bitů.

Pokud ale budeš chtít převést výsledek z ukázky výše, tedy 0,1 do dvojkové soustavy, tak zjistíš, že má toto číslo ve dvojkové soustavě nekonečný rozvoj.

Do paměti se ale uloží pouze 32 bitů. Po zpětném převodu takto uloženého čísla do desítkové soustavy tak dochází k chybě.

V přiloženém obrázku jde vše vidět. V levo převod z desítkové na dvojkovu soustavu, kde lze vidět periodicky se opakující sekvence, která tvoří nekonečný rozvoj a v pravo zpětný převod 32 bitů z tohoto rozvoje zpět na desítkové číslo.

 
Odpovědět
25.9.2017 23:10
Avatar
Branislav David:9.10.2017 21:19

Ahoj, chcel som sa opytat co treba stlacit aby mi ukazal netbeans tu dokumentaciu co sme tam zapisovali v komentaroch ku tej triede zdravic.

 
Odpovědět
9.10.2017 21:19
Avatar
gcx11
Redaktor
Avatar
Odpovídá na Branislav David
gcx11:9.10.2017 21:49

Ahoj, nejspíše Ctrl+Shift+Space

 
Odpovědět
9.10.2017 21:49
Avatar
Odpovídá na gcx11
Branislav David:9.10.2017 22:51

aha uz to mam, len CTRL ale dik :)

 
Odpovědět
9.10.2017 22:51
Avatar
Tonda Đình Hoàng:8.12.2017 20:20

Můžu se zeptat, proč se používá spíše ten 2) než ten 1)
totiž ono dává stejný výsledek tak jsem nepochopil proč
děkuju předem za odpověd´

  1. public void pozdrav(String jmeno) {

    System.out.prin­tf("%s %s\n", text, jmeno);

    }

  2. public String pozdrav(String jmeno) {

    return String.format("%s %s", text, jmeno);

}

 
Odpovědět
8.12.2017 20:20
Avatar
Taskkill
Redaktor
Avatar
Odpovídá na Tonda Đình Hoàng
Taskkill:8.12.2017 21:31

Protoze nemusis vzdycky chtit zdravit na konzoli. Takze chces obecnou metodu, ktera sama nedela nic navic a jen zkonstruuje vystup.

 
Odpovědět
8.12.2017 21:31
Avatar
Abe
Člen
Avatar
Odpovídá na Tonda Đình Hoàng
Abe:8.12.2017 22:11

Jen si představ, že bys pak chtěl ten výstup z metody pozdrav(...) uložit do proměnné a nějak s ním později pracovat. Pokud ti to jen ta metoda vypíše (1), nikam to neuložíš. Ale pokud si uděláš metodu vracející ten pozdrav jako řetězec (2), už je na tobě, jestli ten řetězec rovnou vypíšeš, anebo si ho uložíš to proměnné, a pak použiješ až tu proměnnou, popř. třeba ten text v proměnné budeš moct zanalyzovat, přidat k němu něco atd.

 
Odpovědět
8.12.2017 22:11
Avatar
Tonda Đình Hoàng:12.12.2017 16:15

Děkuju moc Taskkill a Abe

 
Odpovědět
12.12.2017 16:15
Avatar
Karel Klíč
Člen
Avatar
Karel Klíč:7.2.2018 3:01

V eclipse musí být každá třída zvlášt jako soubor tedy celá metoda, kterou naprogramujete standartně, nevím zda tam nastavit jde aby i program samotný mohl být v jednom souboru. Pokud to jde písněte někdo jak?

 
Odpovědět
7.2.2018 3:01
Avatar
Karel Klíč
Člen
Avatar
Karel Klíč:7.2.2018 3:04

No nvm zamontovat do komponenty celý program? nvm nvm nebo nový soubor s novou komponentou a soubor programu samotného zvlášť jak to dělám v eclipse v jednom projektu, v tom samém balíčku a víc souborů tedy komponent s atributy a metodami. A nebo to vše nasrat pak do jednoho?

 
Odpovědět
7.2.2018 3:04
Avatar
MiroslavP
Člen
Avatar
MiroslavP:25.2.2018 14:29

Ahoj, mohu poprosit o radu? v úloze -Hello object world požaduje v deklarovat třídu Program.
chybové hlášení = "class Program is public, should be declarated in a file named Program.java"
Nechápu proč to je? Děkuji:-)

public class HelloObject {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Zdravic zdravic;
zdravic = new Zdravic();

}

}

public class Program
{
public static void main(String[] args) {

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

 
Odpovědět
25.2.2018 14:29
Avatar
MiroslavP
Člen
Avatar
MiroslavP:4.3.2018 0:33

OOP je vzrušující, pro mne je zatím těžší k pochopení. S pomocí prima tutoriálu jsem se snad trochu prokousal... dík.MP :-)

 
Odpovědět
4.3.2018 0:33
Avatar
Robert Michalovič:4.3.2018 6:09

2MiroslavP : "class Program is public, should be declarated in a file named Program.java"

  • to není potřeba chápat ale hlavně zapamatovat. Každá public class musí být ve vlastním souboru, který se jmenuje jako ta class.

např. public class Auto musí být v souboru Auto.java
např. public class Hvezda musí být v souboru Hvezda.java

pokud se jedná o tvz. nepublic class pak ta může být kdekoliv ( jako vnitřní, anonymní, případně vnější třída,atd.. )
např. public class Hudba bude v souboru Hudba.java + bude v sobě mít ještě vnitřní class Disco, class Classica

// soubor Hudba.java
public class Hudba {
        ....
        class Disco {
        ....
        }
        class Classica {
        ....
        }
}

nebo

např. public class Hudba bude v souboru Hudba.java + součástí souboru Hudba.java budou ještě vnější třídy: class Disco, class Classica

// soubor Hudba.java
class Disco {
        ....
}
class Classica {
        ....
}
public class Hudba  {
        ....
}

Těd si to jenom zapamatuj a na praktické využití přijdeš časem.

Editováno 4.3.2018 6:11
 
Odpovědět
4.3.2018 6:09
Avatar
Libor Šimo (libcosenior):28.9.2018 13:10

Ahoj, toto je v článku:
"Podíváme se, že nám NetBeans opravdu popisky zobrazí:"

Asi nemám niečo správne nastavené. Mne sa popis nezobrazuje.
Poradte prosím.

Odpovědět
28.9.2018 13:10
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
ostrozan
Redaktor
Avatar
Odpovídá na Libor Šimo (libcosenior)
ostrozan:30.9.2018 18:04

O tři řádky výš se píše , že to nejdřív musíš nastavit v Tools -> Analyze Javadoc

 
Odpovědět
30.9.2018 18:04
Avatar
Odpovídá na ostrozan
Libor Šimo (libcosenior):30.9.2018 19:03

To si vážne myslíš, že som to nespravil?
Už ale viem ako to funguje.
Nie ukázať na metódu myšou, ale napísať názov inštancie, dať botku a vtedy sa zobrazí. Proste v článku je zavádzajúca informácia.

Odpovědět
30.9.2018 19:03
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Ondřej Bartík:8.11.2018 9:36

Sice je to trochu pozdě, ale stačí kliknout na to jednotlivé slovo, nebo prakticky jakoukoli část kódu a stisknout CTRL + Mezerník.
Pak NetBeans vyhodí nápovědu, ve které je i dokumentace, pokud je dostupná. Super je to na integrované metody, kde je ta dokumentace dobře zpracovaná.

 
Odpovědět
8.11.2018 9:36
Avatar
Karel Klíč
Člen
Avatar
Karel Klíč:15.12.2018 19:19

Divím se co jsem tu psal teď je mi jasné že každá třída class je jeden soubor tedy komponenta která obsahuje metody, teď už mi došlo, že co soubor tedy class respektive .java je tou výhodou a komponentou celého objektově orientovaného programování. To je přesně to paradigma.

 
Odpovědět
15.12.2018 19:19
Avatar
Tomas Gorcos
Člen
Avatar
Tomas Gorcos:12.2.2019 13:47

Dobrý deň. Chcem sa opýtať, kde by som našiel bližšie špecifikacie pre printf a všetky tie symboli, cisla a pismena. Ako a kde sa používajú?

 
Odpovědět
12.2.2019 13:47
Avatar
Odpovědět
12.2.2019 13:48
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Alesh
Překladatel
Avatar
Alesh:19.3.2019 20:41

Mohl by mi někdo zkušený říct, jestli jsem se správně zhostil úkolu předělání kalkulačky do objektové varianty? Jakékoli konstruktivní připomínky vítány! ;-)

Pozn.: zaokrouhlovací chybu u floatu neřeším, zrovna tak jsem si odpustil ten cyklus na opětovné použití kalkulačky.

Jde mi čistě o tu "konstrukci", kde použít objekt a kde to nechat v rovině strukturovaného programování. A jestli to, jak jsem to napsal, vypadá jako kdyby to psal opravdový programátor. :-)

main:

package kalkulackaobject;

/**
 *
 * @author Aleš Bláha
 */
public class KalkulackaObject {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // inicializace kalkulacky
        Kalkulacka kalkulacka = new Kalkulacka();

        //uvitaci hlaska
        kalkulacka.vypisUvitani();

        do{
            kalkulacka.vypisVyzvuKZadaniHodnotyDoKonzole(1);
        }while(!kalkulacka.NactiAOtestujZadanouHodnotuZKonzole(1));

        do{
            kalkulacka.vypisVyzvuKZadaniHodnotyDoKonzole(2);
        }while(!kalkulacka.NactiAOtestujZadanouHodnotuZKonzole(2));

        do{
            kalkulacka.vypisVyzvuKZadaniOperatoraDoKonzole();
        }while(!kalkulacka.NactiAOtestujZadanehoOperatoraZKonzole());

        kalkulacka.VypoctiAVypisVysledekDoKonzole();

        //podekovani za pouziti
        kalkulacka.vypisPodekovani();
    }

}

kalkulačka:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package kalkulackaobject;

import java.util.Scanner;

/**
 * trida Kalkulacka
 * @author Aleš Bláha
 */
public class Kalkulacka {
    /** prvni zadavane cislo */
    private float cislo1;

    /** druhe zadavane cislo */
    private float cislo2;

    /** symbol operace (+, -, *, /) */
    private Character operace;

    /** vypise uvitaci hlasku */
    public void vypisUvitani(){
        System.out.println("Vítejte v programu Kalkulačka!");
    }

    /** vypise dekovaci hlasku */
    public void vypisPodekovani(){
        System.out.println("Děkuji za použití kalkulačky.");
    }

    /**
     * vypise hlasku pro vlozeni prvni nebo druhe hodnoty
     * @param poradiHodnoty 1. nebo 2. zadavana hodnota (vlozit lze pouze 1 nebo 2)
     */
    public void vypisVyzvuKZadaniHodnotyDoKonzole(int poradiHodnoty){
        System.out.printf("Zadej %d. číslo: ", poradiHodnoty);
    }

    /**
     * z konzole nacte prvni nebo druhou vstupni hodnotu, ulozi do prislusne promenne
     * @param poradiHodnoty 1. nebo 2. zadavana hodnota (vlozit lze pouze 1 nebo 2)
     * @return info je hodnota v poradku
     */
    public boolean NactiAOtestujZadanouHodnotuZKonzole(int poradiHodnoty){
        try{
            Scanner sc = new Scanner(System.in, "Windows-1250");
            switch (poradiHodnoty) {
                case 1:
                    cislo1 = Float.parseFloat(sc.nextLine());
                    return true;
                case 2:
                    cislo2 = Float.parseFloat(sc.nextLine());
                    return true;
                default:
                    return false;
            }
        }
        catch(Exception e){
            return false;
        }
    }

    /** vypise hlasku pro vlozeni operatora (+, -, *, /) */
    public void vypisVyzvuKZadaniOperatoraDoKonzole(){
        System.out.print("Zadej operátora (+, -, *, /): ");
    }

    /**
     * z konzole nacte operatora (povolene operatory: +, -, *, /), ulozi do prislusne promenne
     * @return info je operator v poradku
     */
    public boolean NactiAOtestujZadanehoOperatoraZKonzole(){
        try{
            Scanner sc = new Scanner(System.in, "Windows-1250");
            operace = sc.nextLine().charAt(0);
            switch (operace) {
                case '+':
                case '-':
                case '*':
                case '/':
                    return true;
                default:
                    return false;
            }
        }
        catch(Exception e){
            return false;
        }
    }

    /**
     * vypocte a vypise vysledek do konzole
     */
    public void VypoctiAVypisVysledekDoKonzole(){
        float vysledek = 0;
        switch(operace){
            case '+':
                 vysledek = cislo1 + cislo2;
                 break;
            case '-':
                vysledek = cislo1 - cislo2;
                break;
            case '*':
                vysledek = cislo1 * cislo2;
                break;
            case '/':
                vysledek = (float) cislo1 / cislo2;
                break;
        }
        System.out.printf("%f %c %f = %f\n", cislo1, operace, cislo2, vysledek);
    }
}
 
Odpovědět
19.3.2019 20:41
Avatar
Wopat
Člen
Avatar
Wopat:5.4.2019 17:19

V lekci je uvedeno, že při vytvoření nové třídy NetBeans automaticky vygeneruje následující kód:

package helloobjects;

public class Zdravic {

}

U mě je však třída úplně prázdná. Zkoušel jsem hledat v nastavení IDE i na internetu, ale bohužel bez úspěchu. Nevíte někdo, kde je problém, prosím?

Odpovědět
5.4.2019 17:19
The difficult we do immediately. The impossible takes a little longer.
Avatar
Danny Holys
Člen
Avatar
Danny Holys:23.7.2019 12:50

Chtěl bych se zeptat místních veteránů, zda jsem tu kalkulačku v objektech napsal dobře, nebo spíše tedy, jestli se tam nedá něco zlepšit z ohledu OOP. díky moc :)

hlavní main:

package kalkulacka_objekt;
import java.util.Scanner;

/**
 *
 * @author Danie
 */
public class Kalkulacka_objekt {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here
        Kalkulator kalkulator = new Kalkulator();
        Scanner sc = new Scanner(System.in, "Windows-1250");
        kalkulator.pokracovat = "ano";
        float vysledek =0;
        System.out.println("Vítejte v kalkulačce");

        while(kalkulator.pokracovat.equals("ano")){
            System.out.println("Zadejte první číslo");
            float a = Float.parseFloat(sc.nextLine());
            System.out.println("Zadejte druhé číslo:");
            float b = Float.parseFloat(sc.nextLine());
            System.out.println("Zvolte si operaci:");
            System.out.println("1 - sčítání");
            System.out.println("2 - odčítání");
            System.out.println("3 - násobení");
            System.out.println("4 - dělení");
            int volba = Integer.parseInt(sc.nextLine());
            System.out.println(kalkulator.proces(volba, a, b, vysledek));
            System.out.println("Přejete si pokračovat?");
            kalkulator.pokracovat = sc.nextLine();
        }
        System.out.println("Děkuji za využití kalkulačky");
    }

}

Třída Kalkulator:

package kalkulacka_objekt;

/**
 *
 * @author Danie
 */
public class Kalkulator {
    public String pokracovat;

    public String proces(int volba, float a, float b, float vysledek){
        if (volba == 1)
        {
           vysledek = a + b;
        }
        else if (volba == 2)
        {
           vysledek = a - b;
        }
        else if (volba == 3)
        {
           vysledek = a * b;
        }
        else if (volba == 4)
        {
           vysledek = a / b;
        }
        if ((volba > 0) && (volba < 5))
        {
          return String.format("Výsledek: " + Float.toString(vysledek));
        }
        else
        {
           return String.format("Neplatná volba");
        }

    }
}
 
Odpovědět
23.7.2019 12:50
Avatar
Odpovídá na Danny Holys
Michal Šmahel:24.7.2019 18:27

Ahoj, jsem moc rád, že se zajímáš o kvalitu svého kódu a nebojíš se zde zeptat. Jako začátečník děláš různé zbytečné chyby (i vážnějšího charakteru) a je dobré o nich vědět, aby ses jim příště mohl vyvarovat. Neber to prosím jako kritiku, ale spíše jako doporučení. Když jsem začínal, dělal jsem také podobné věci. Není na tom nic špatného, jen je třeba na sobě stále pracovat a tyto chyby eliminovat. Doporučuji si tyto zdrojové kódy někam uložit a podívat se na ně po nějaké době, jistě zaznamenáš velký pokrok.

Tedy k věci. Nejprve přikládám pozměněný kód. Opravím chyby, které jsi udělal a následně uvedu zdůvodnění.

Main třída:

package kalkulacka_objekt;
import java.util.Scanner;

/**
 *
 * @author Danie
 */
public class Kalkulacka_objekt {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        Kalkulator kalkulator = new Kalkulator();
        Scanner sc = new Scanner(System.in, "Windows-1250");

        /* O tom, zda se má pokračovat třída Kalkulator vůbec nerozhoduje
         * Již z názvu vypovídá, že je to třída, která bude kalkulovat (počítat),
         * do běhu řídícího cyklu (ten while, co máš níže) nemá co zasahovat
         * navíc je zbytečné využívat String. Tato proměnná nabývá pouze 2 hodnot,
         * což napovídá datový typ boolean (ano -> true, ne -> false)
         * Výsledek není třeba inicializovat ani neklarovat
         */
        boolean pokracovat = true;

        System.out.println("Vítejte v kalkulačce");

        /* Tady se musí změnit podmínka kvůli tomu, že už se stav pokračování
         * uchovává úplně jinak
         * Můžeš si představit jako: while(pokracovat == true) {
         */
        while(pokracovat){
            System.out.println("Zadejte první číslo");
            float a = Float.parseFloat(sc.nextLine());

            System.out.println("Zadejte druhé číslo:");
            float b = Float.parseFloat(sc.nextLine());

            System.out.println("Zvolte si operaci:");
            System.out.println("1 - sčítání");
            System.out.println("2 - odčítání");
            System.out.println("3 - násobení");
            System.out.println("4 - dělení");
            // Je lepší mít ty názvy proměnných přesnější
            int operace = Integer.parseInt(sc.nextLine());

            /* Výsledek nepředáváme, je to k ničemu,
             * ten teprve metoda vypocitej() spočítá
             */
            System.out.println(kalkulator.vypocitej(operace, a, b));

            System.out.println("Přejete si pokračovat? A/n");
            /* Opět kvůli změně výše
             * Dalo by se zkrátit na: pokracovat = (Character.parseChar(sc.nextLine()) === 'A');
             */
            if(Character.parseChar(sc.nextLine()) == 'A')
            {
                pokracovat = true;
            }
            else
            {
                pokracovat = false;
            }
        }

        System.out.println("Děkuji za využití kalkulačky");
    }
}

Třída Kalkulator:

package kalkulacka_objekt;

/**
 *
 * @author Danie
 */
public class Kalkulator {
    /* Tady to chce lepší název metody - měl by to být nějaký rozkaz
     * Název parametru volba opět není nejlepší
     * Není důvod k předávání výsledku - ten se teprve vypočítá
     */
    public String vypocitej(int operace, float a, float b){
        /* Tohle je lepší mít hned na začátku, pokud se uvede chybná volba,
         * mělo by se ihned skončit (nemá smysl pokračovat dál)
         * Skončí se tak, že se zavolá return
         */
        if ((volba < 0) || (volba > 5))
        {
          /* Tady je String.format() zbytečné, to se používá při vkládání proměnné
           * do řetězce
           */
          return "Neplatná volba";
        }

        float vysledek;

        /* Tohle bych řešil spíše přes switch - potom bys nemusel mít
         * ani podmínku nad deklarací proměnné vysledek, ale využil bys
         * výchozí volbu (default)
         * Velkou výhodou je, že nemusíš upravovat okolní kód, když chceš
         * přidat novou operaci nebo nějakou odebrat
         */
        if (operace == 1)
        {
           vysledek = a + b;
        }
        else if (operace == 2)
        {
           vysledek = a - b;
        }
        else if (operace == 3)
        {
           vysledek = a * b;
        }
        else if (operace == 4)
        {
           // TODO: Ošetřit dělení nulou
           vysledek = a / b;
        }

        /* Nyní již můžeš vklidu vrátit výsledek
         * Také zde vidíš použití metody String.format()
         */
        return String.format("Výsledek: %f", vysledek);
    }
}

Většinu věcí jsem nakonec sepsal přímo do kódu. Jen ještě doplním, že je dobré si dělat mezery v kódu pro větší přehlednost. Obvykle po nějakém "bloku" kódu. To není povinné, ale potom se v tom lépe orientuješ. Sice už tam není třídní vlastnost pokracovat, ale stejně k ní něco zmíním. V Javě je třeba psát většinu vlastností jako privátní nebo protected. Tímto porušuješ zapouzdření. V ideálním případě by k vlastnostem přímo (Trida.vlasnost) měla mít přístup jen daná třída. Ostatní by měly využívat pomocné metody - gettery a settery (v dalších článcích je to dobře rozepsané). Také je občas dobré se zamyslet nad pořadím příkazů. Často tím, že nejprve ověříš vstupní parametry metody, ušetříš mnoho času počítači i sobě. Ty nebudeš muset ošetřovat stavy, které by mohly dále vzniknout a počítač úlohu dříve dokončí. Také dávej pozor na pojmenování proměnných, parametrů, metod apod. Je třeba, aby to bylo jasné, výstižné a co nejjednodušší. Zase to pomáhá orientaci v kódu a obecné přehlednosti.

No, to by bylo asi vše. V klidu si to projdi, pročti si mé poznámky a zkus si uvědomit dané chyby. Pokud se stane, že něco nepochopíš, ještě mi odepiš, rád cokoliv doplním.

Odpovědět
24.7.2019 18:27
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Petr Hošek
Člen
Avatar
Petr Hošek:25.7.2019 1:27

muzete mi pomoci? pokazde mi to vraci vysledek 0.

package com.company;

import java.util.Scanner;

public class Kalkulator {
    private float a;
    private float b;
    private int volba;


    public void privitani() {
        System.out.println("Vitejte v kalkulacce!!!");
    }

    public void podekovani() {
        System.out.println("Dekujeme za pouziti kalkulacky");
    }

    public void zobrazeni() {
        System.out.println("1-scitani");
        System.out.println("2-odcitani");
        System.out.println("3-deleni");
        System.out.println("4-nasobeni");
    }

    public float vypocet() {

        float vysledek =0;

        switch (volba) {
            case 1: vysledek=a+b;
            break;
            case 2: vysledek=a-b;
            break;
            case 3: vysledek=a/b;
            break;
            case 4:vysledek=(a*b);
            break;
        }
        return vysledek;

    }
}
package com.company;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Kalkulator kalkulator=new Kalkulator();
        Scanner sc=new Scanner(System.in,"Windows-1250");
        String pokracovat="ano";
while(pokracovat.equals("ano")){
    kalkulator.privitani();
    System.out.println("Zadejte prvni cislo");
    float a=Float.parseFloat(sc.nextLine());
    System.out.println("Zadejte druhe cislo");
    float b=Float.parseFloat(sc.nextLine());
    kalkulator.zobrazeni();
    System.out.println("Vyberte operaci");
    int volba=Integer.parseInt(sc.nextLine());
    if ((volba>0)&&(volba<5)) {
        System.out.printf("Vysledek je %f ", kalkulator.vypocet());
    }
    else{
        System.out.printf("spatne zadani");
    }
    System.out.println();
    kalkulator.podekovani();
    System.out.printf("Prejete si pokracovat? ano/ne");
    pokracovat = sc.nextLine();
}
}

}
 
Odpovědět
25.7.2019 1:27
Avatar
Danny Holys
Člen
Avatar
Odpovídá na Michal Šmahel
Danny Holys:25.7.2019 2:05

Wow, skvělý!

Děkuji ti moc za to, že jsi si na mě udělal čas. :)

Takhle teď v noci jsem si to narychlo projel a všemu jsem zatím porozuměl. Odpoledne se na to podívám důkladněji a kdyžtak ještě napíšu .)

 
Odpovědět
25.7.2019 2:05
Avatar
Odpovídá na Petr Hošek
Michal Šmahel:25.7.2019 12:28

Ahoj, v metodě Kalkulator.vy­pocet() ti chybí parametr volba. Takhle v proměnné volba (ve zmiňované metodě) není žádná hodnota. Tím pádem se switch vlastně vynechá, protože neobsahuje tu neexistující hodnotu. No a vrátí se výchozí hodnota výsledku - 0.

Odpovědět
25.7.2019 12:28
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
Gemy
Člen
Avatar
Gemy:16. března 19:21

Chybí mi nějaká vizuální podoba package class public void atd. to že je něco třída nebo metoda je super vědět. Ale lépe si to představím jako matriošku, třeba.

Odpovědět
16. března 19:21
Peníze neznamenají úspěch.
Avatar
Gemy
Člen
Avatar
Gemy:22. března 21:22

MAIN

package opp.kalkulacka;
public class OppKalkulacka {

    public static void main(String[] args) {
    Vypocty vypocty = new Vypocty();

    System.out.println("KALKULAČKA");

    do{

    System.out.print("První číslo : ");
        vypocty.zapisCisloJedna();

    System.out.print("Zadej operaci : ");
        vypocty.zapisSymbol();

    System.out.print("Druhe číslo : ");
        vypocty.zapisCisloDva();

        vypocty.provedOperaci();

    System.out.print("Chcete zadání opakovat? [ANO|NE] : ");
        vypocty.opakujKalkulacku();

    } while (vypocty.opakovani == true);
    }
}

TŘÍDA

package opp.kalkulacka;
import java.util.Scanner;
public class Vypocty {
    Scanner sc = new Scanner(System.in,"Windows-1250");
    float prvniCislo;
    float druheCislo;
    String symbol;
    float vysledek = 0;
    boolean opakovani = true;

    public void zapisCisloJedna(){
        prvniCislo = Float.parseFloat(sc.nextLine());
    }
    public void zapisCisloDva(){
        druheCislo = Float.parseFloat(sc.nextLine());
    }
    public void zapisSymbol(){
        symbol = sc.nextLine().trim();
    }
    public void provedOperaci(){
        switch (symbol){
            case "+":
                vysledek = prvniCislo + druheCislo;
            break;
            case "-":
                vysledek = prvniCislo - druheCislo;
            break;
            case "/":
                vysledek = prvniCislo / druheCislo;
            break;
            case "*":
                vysledek = prvniCislo * druheCislo;
            break;
            default: System.out.println("Chybná operace");
            return;
        }
        System.out.println("Vysledek : " + vysledek);
    }
    public void opakujKalkulacku(){
        String zadani = sc.nextLine().trim().toLowerCase();
        if (zadani.equals("ne")){
            opakovani = false;
        }
    }

}
Odpovědět
22. března 21:22
Peníze neznamenají úspěch.
Avatar
Patrik Vala
Člen
Avatar
Patrik Vala:27. března 16:38

Ahoj :-) můžete mi prosím někdo vysvětlit tu metodu toString() ?, vůbec to nechápu.

 
Odpovědět
27. března 16:38
Avatar
Alesh
Překladatel
Avatar
Odpovídá na Patrik Vala
Alesh:27. března 21:05

Máš to vysvětleno ve Lekce 3 - Hrací kostka v Javě - konstruktory a náhodná čísla, konkrétně hledej odstavec nazvaný "Překrývání metody toString()".

 
Odpovědět
27. března 21:05
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 109 zpráv z 109.