Pouze tento týden sleva až 80 % na e-learning týkající se Javy. Zároveň využij akce až 50 % zdarma při nákupu e-learningu - více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
discount 50 + hiring

Lekce 3 - Hrací kostka v Javě - Zapouzdření, konstruktor a Random

V předešlém cvičení, Řešené úlohy k 2. lekci OOP v Javě, jsme si procvičili nabyté zkušenosti z předchozích lekcí.

V dnešním tutoriálu začneme pracovat na slíbené aréně, ve které budou proti sobě bojovat dva bojovníci. Boj bude tahový (na přeskáčku) a bojovník vždy druhému ubere život na základě síly jeho útoku a obrany druhého bojovníka. Simulujeme v podstatě stolní hru, budeme tedy simulovat i hrací kostku, která dodá hře prvek náhodnosti. Začněme zvolna a vytvořme si dnes právě tuto hrací kostku. Zároveň se naučíme jak definovat vlastní konstruktor.

Vytvoření projektu

Vytvořme si nový projekt a pojmenujme ho TahovyBoj. K projektu si přidejme novou class s názvem Kostka. Zamysleme se nad atributy, které kostce dáme. Jistě by se hodilo, kdybychom si mohli zvolit počet stěn kostky (klasicky 6 nebo 10 stěn, jak je zvykem u tohoto typu her). Dále bude kostka potřebovat tzv. generátor náhodných čísel. Ten nám samozřejmě poskytne Java, která k těmto účelům obsahuje třídu Random. Abychom ji mohli používat, použijeme import java.util.Random. Import napíšeme nahoru, jak jsme zvyklí z používání Scanneru. Naše třída bude mít nyní 2 atributy:

  • pocetSten typu int
  • random typu Random, kde bude náhodný generátor.

Zapouzdření

Minule jsme kvůli jednoduchosti nastavovali všechny atributy naší třídy jako public, tedy jako veřejně přístupné. Většinou se však spíše nechce, aby se daly zvenčí modifikovat a používá se modifikátor private. Atribut je poté viditelný jen uvnitř třídy a zvenčí se Java tváří, že vůbec neexistuje. Při návrhu třídy tedy nastavíme vše na private a v případě, že něco bude opravdu potřeba vystavit, použijeme public. Naše třída nyní vypadá asi takto:

import java.util.Random;

/** Třída reprezentuje hrací kostku */
public class Kostka {
    /** Generátor náhodných čísel */
    private Random random;
    /** Počet stěn kostky */
    private int pocetSten;
}

Konstruktory

Až doposud jsme neuměli zvenčí nastavit jiné atributy než public, protože např. private nejsou zvenčí viditelné. Již jsme si říkali něco málo o konstruktoru objektu. Je to metoda, která se zavolá ve chvíli vytvoření instance objektu. Slouží samozřejmě k nastavení vnitřního stavu objektu a k provedení případné inicializace. Kostku bychom nyní v TahovyBoj.java vytvořili takto:

Kostka kostka = new Kostka();

Právě Kostka() je konstruktor. Protože v naší třídě žádný není, Java si dogeneruje prázdnou metodu. My si však nyní konstruktor do třídy přidáme. Deklaruje se jako metoda, ale nemá návratový typ a musí mít stejné jméno jako je jméno třídy (začíná tedy narozdíl od ostatních metod velkým písmenem), v našem případě tedy Kostka. V konstruktoru nastavíme počet stěn na pevnou hodnotu a vytvoříme instanci třídy Random. Konstruktor bude vypadat následovně:

public Kostka() {
    pocetSten = 6;
    random = new Random();
}

Pokud kostku nyní vytvoříme, bude mít v atributu pocetSten 6 a v random bude vytvořená instance generátoru náhodných čísel. Vypišme si počet stěn do konzole, ať vidíme, že tam hodnota opravdu je. Není dobré atribut nastavit na public, protože nebudeme chtít, aby nám někdo mohl již u vytvořené kostky měnit počet stěn. Přidáme do třídy tedy metodu vratPocetSten(), která nám vrátí hodnotu atributu pocetSten. Docílili jsme tím v podstatě toho, že je atribut read-only (atribut není viditelný a lze ho pouze číst metodou, změnit ho nelze). Nová metoda bude vypadat asi takto:

/**
 * Vrátí počet stěn hrací kostky
 * @return      počet stěn hrací kostky
 */
public int vratPocetSten() {
    return pocetSten;
}

Přesuňme se do TahovyBoj.java a vyzkoušejme si vytvořit kostku a vypsat počet stěn:

    Kostka kostka = new Kostka(); // v tuto chvíli se zavolá konstruktor
    System.out.println(kostka.vratPocetSten());
import java.util.Random;

Výstup:

Konzolová aplikace
6

Vidíme, že se konstruktor opravdu zavolal. My bychom ale chtěli, abychom mohli u každé kostky při vytvoření specifikovat, kolik stěn budeme potřebovat. Dáme tedy kostruktoru parametr:

public Kostka(int aPocetSten) {
    pocetSten = aPocetSten;
    random = new Random();
}

Všimněte si, že jsme před název parametru metody přidali znak "a", protože jinak by měl stejný název jako atribut a Javu by to zmátlo. Vraťme se k TahovyBoj.java a zadejme tento parametr do konstruktoru:

    Kostka kostka = new Kostka(10); // v tuto chvíli se zavolá konstruktor s par. 10
    System.out.println(kostka.vratPocetSten());
import java.util.Random;

Výstup:

Konzolová aplikace
10

Vše funguje, jak jsme očekávali. Java nám již v tuto chvíli nevygeneruje prázdný (tzv. bezparametrický konstruktor), takže kostku bez parametru vytvořit nelze. My to však můžeme umožnit, vytvořme si další konstruktor a tentokrát bez parametru. V něm nastavíme počet stěn na 6, protože takovou hodnotu asi uživatel naší třídy u kostky očekává jako výchozí:

public Kostka() {
    pocetSten = 6;
    random = new Random();
}

Zkusme si nyní vytvořit 2 instance kostky, každou jiným konstruktorem (v TahovyBoj.java):

    Kostka sestistenna = new Kostka();
    Kostka desetistenna = new Kostka(10);
    System.out.println(sestistenna.vratPocetSten());
    System.out.println(desetistenna.vratPocetSten());
import java.util.Random;

Výstup:

Konzolová aplikace
6
10

Javě nevadí, že máme 2 metody se stejným názvem, protože jejich parametry jsou různé. Hovoříme o tom, že metoda Kostka (tedy zde konstruktor) má přetížení (overload). Toho můžeme využívat i u všech dalších metod, nejen u konstruktorů. NetBeans nám přehledně nabízí všechny přetížení metody ve chvíli, kdy zadáme její název. V nabídce vidíme naše 2 konstruktory:

Nápověda k přetíženým metodám v Javě

Mnoho metod v Javě má hned několik přetížení, zkuste se podívat např. na metodu indexOf() na třídě String. Je dobré si u metod projít jejich přetížení, abyste neprogramovali něco, co již někdo udělal před vámi.

Ukážeme si ještě, jak jde obejít nepraktický název atributu u parametrického konstruktoru (v našem případě aPocetSten) a potom konstruktory opustíme. Problém je samozřejmě v tom, že když napíšeme:

public Kostka(int pocetSten) {
    pocetSten = pocetSten;
    random = new Random();
}

Java neví, kterou z proměnných myslíme, jestli parametr nebo atribut. V tomto případě přiřazujeme do parametru znovu ten samý parametr. NetBeans nás na tuto skutečnost dokonce upozorní. Uvnitř třídy se máme možnost odkazovat na její instanci, je uložena v proměnné this. Využití si můžeme představit např. kdyby kostka měla metodu dejHraci(Hrac hrac) a tam by volala hrac.seberKos­tku(this). Zde bychom hráči pomocí this předali sebe sama, tedy tu konkrétní kostku, se kterou pracujeme. My se tím zde nebudeme zatěžovat, ale využijeme odkazu na instanci při nastavování atributu:

public Kostka(int pocetSten) {
    this.pocetSten = pocetSten;
    random = new Random();
}

Pomocí this jsme specifikovali, že levá proměnná pocetSten náleží instanci, pravou Java chápe jako z parametru. Máme tedy 2 konstruktory, které nám umožňují tvořit různé hrací kostky. Přejděme dál.

Náhodná čísla

Definujme na kostce metodu hod(), která nám vrátí náhodné číslo od 1 do počtu stěn. Je to velmi jednoduché, metoda bude public (půjde volat zvenčí) a nebude mít žádný parametr. Návratová hodnota bude typu int. Náhodné číslo získáme tak, že na generátoru zavoláme metodu nextInt(). Ta má 2 přetížení:

  • nextInt(): Varianta bez parametru vrací náhodné číslo v celém rozsahu datového typu int;
  • nextInt(Do): Vrací nezáporná čísla menší než mez Do. random.nextInt(100) tedy vrátí číslo od 0 do 99.

Pro naše účely se nejlépe hodí druhé přetížení, píšeme tedy:

/**
* Vykoná hod kostkou
* @return Číslo od 1 do počtu stěn
*/
public int hod() {
    return random.nextInt(pocetSten) + 1;
}

Dejte si pozor, abyste netvořili generátor náhodných čísel v metodě, která má náhodné číslo vracet, tedy že by se pro každé náhodné číslo vytvořil nový generátor. Výsledná čísla pak nejsou téměř náhodná nebo dokonce vůbec. Vždy si vytvořte jednu sdílenou instanci generátoru (např. do privátního atributu pomocí konstruktoru) a na té potom metodu nextInt() volejte.

Překrývání metody toString()

Kostka je téměř hotová, ukažme si ještě jednu užitečnou metodu, kterou ji přidáme a kterou budeme hojně používat i ve většině našich dalších objektů. Řeč je o metodě toString(), o které jsme se již zmínili a kterou obsahuje každý objekt, tedy i nyní naše kostka. Metoda je určena k tomu, aby vrátila tzv. textovou reprezentaci instance. Hodí se ve všech případech, kdy si instanci potřebujeme vypsat nebo s ní pracovat jako s textem. Tuto metodu mají např. i čísla. Již víme, že v Javě funguje implicitní konverze, jakmile tedy budeme chtít do konzole vypsat objekt, Java na něm zavolá metodu toString() a vypíše její výstup. Pokud si děláme vlastní třídu, měli bychom zvážit, zda se nám takováto metoda nehodí. Nikdy bychom si neměli dělat vlastní metodu, např. něco jako vypis(), když máme v Javě připravenou cestu, jak toto řešit. U kostky nemá toString() vyšší smysl, ale u bojovníka bude jistě vracet jeho jméno. My si ji ke kostce stejně přidáme, bude vypisovat, že se jedná o kostku a vrátí i počet stěn. Nejprve si zkusme vypsat do konzole naši instanci kostky:

    System.out.println(sestistenna);
import java.util.Random;

Do konzole se vypíše pouze cesta k naší třídě, tedy tahovyboj.Kostka a tzv. hash kód objektu. V mém případě byl vypsán tento řetězec:

Konzolová aplikace
[email protected]

Metodu již jednoduše nedefinujeme, ale protože již exituje, musíme ji přepsat, resp. překrýt. Tím se opět nebudeme nyní podrobně zabývat, nicméně chci, abychom již teď uměli toString() používat. Pro přehledné překrytí označíme metodu anotací @Override:

    /**
     * Vrací textovou reprezentaci kostky
     * @return Textová reprezentace kostky
     */
    @Override
    public String toString() {
    return String.format("Kostka s %s stěnami", pocetSten);
    }

Nyní opět zkusíme do konzole vypsat přímo instanci kostky.

Výstup:

Konzolová aplikace
Kostka s 6 stěnami

Ještě si naše kostky vyzkoušíme. Zkusíme si v programu s našima dvěma kostkama v cyklech házet a podíváme se, jestli fungují tak, jak se očekává:

    // vytvoření
    Kostka sestistenna = new Kostka();
    Kostka desetistenna = new Kostka(10);

    // hod šestistěnnou
    System.out.println(sestistenna);
    for (int i = 0; i < 10; i++) {
        System.out.print(sestistenna.hod() + " ");
    }

    // hod desetistěnnou
    System.out.println("\n\n" + desetistenna);
    for (int i = 0; i < 10; i++) {
        System.out.print(desetistenna.hod() + " ");
    }

Výstup může vypadat nějak takto:

Konzolová aplikace
Kostka s 6 stěnami
3 6 6 1 6 3 6 2 6 3

Kostka s 10 stěnami
5 9 9 2 10 4 9 3 10 5

Máme hotovou docela pěknou a nastavitelnou třídu, která reprezentuje hrací kostku. Bude se nám hodit v naší aréně, ale můžete ji použít i kdekoli jinde. Vidíme, jak OOP umožňuje znovupoužívat komponenty.

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


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 1982x (2.92 kB)
Aplikace je včetně zdrojových kódů v jazyce Java

 

Předchozí článek
Řešené úlohy k 2. lekci OOP v Javě
Všechny články v sekci
Objektově orientované programování v Javě
Přeskočit článek
(nedoporučujeme)
Řešené úlohy k 3. lekci OOP v Javě
Článek pro vás napsal David Čápka
Avatar
Uživatelské hodnocení:
126 hlasů
David je zakladatelem ITnetwork a programování se profesionálně věnuje 13 let. Má rád Nirvanu, sushi a svobodu podnikání.
Unicorn university David se informační technologie naučil na Unicorn University - prestižní soukromé vysoké škole IT a ekonomie.
Aktivity

 

 

Komentáře

Avatar
tomasfurch
Člen
Avatar
tomasfurch:8.10.2012 0:29

V metodě hod() je jedna +1 navíc, takto by na šestistěnné kostce padaly sedmičky apod. :-)
Správně:
public int hod(){
return random.nextIn­t(pocetSten) + 1;
}

 
Odpovědět
8.10.2012 0:29
Avatar
David Jančík
Tým ITnetwork
Avatar
Odpovídá na tomasfurch
David Jančík:8.10.2012 6:21

No jó, něco na tom bude :) Díky za informaci, opraveno :)

Odpovědět
8.10.2012 6:21
Zapomeň, že je to nemožné a udělej to ;)
Avatar
minecraftgiesi:6.11.2012 19:22

Dobrá kostka,aspoň jsem se něco nového přiučil...

Odpovědět
6.11.2012 19:22
Milujte c#/xna :)
Avatar
Neaktivní uživatel:5.3.2013 17:31

Možná by spíš mělo být:
public int hod(){
return random.nextIn­t(pocetSten-1) + 1;
}
Jinak to totiž hází čísla od nuly do 6, přičemž ještě přičteme jedna - tedy od 1 do 7 a to je blbě, ne?

Odpovědět
5.3.2013 17:31
Neaktivní uživatelský účet
Avatar
Odpovídá na Neaktivní uživatel
Michael Olšavský:5.3.2013 18:38

Myslím, že to je špatně. Sice jsem to nezkoušel v javě, ale v C# ti random vrací číslo o jedno menší něž je maximální hodnota.

Tzn.: random.nexInt(6) ti vrátí max. 5

Snad je to v javě stejně.

 
Odpovědět
5.3.2013 18:38
Avatar
Fugiczek
Tvůrce
Avatar
Odpovídá na Michael Olšavský
Fugiczek:5.3.2013 18:51

Ano je to stejne, vrati cislo v intervalu <0;cislo) cili pokud dame do parametru napriklad 6 a chceme integer, vrati cislo od 0 do 5 vcetne.

 
Odpovědět
5.3.2013 18:51
Avatar
Drakeman
Tvůrce
Avatar
Drakeman:17.3.2013 17:37

Jo pěkná kostka :-) Na posledním obrázku s výstupem koukám, že se šesti stěnami padaly i sedmičky :-D a na desetistěnné padla dokonce i jedenáctka :O :D

Editováno 17.3.2013 17:38
Odpovědět
17.3.2013 17:37
Když se chce, tak jde všechno,
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Drakeman
David Čápka:17.3.2013 17:45

Nojo :D Fixnu to, budu se tu brzy Javě věnovat.

Odpovědět
17.3.2013 17:45
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
Avatar
Benjibs
Člen
Avatar
Benjibs:25.6.2013 16:55

Pri preťažovaní konštruktoru sa @Override nepoužíva, ale pri toString() áno.
Je využitie @Override nepovinné, alebo povinné len u niektorých metód?

Editováno 25.6.2013 16:56
Odpovědět
25.6.2013 16:55
1 + 1 = 2
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Benjibs
Kit:25.6.2013 17:28

Použití @Override je nepovinné, ale jeho systematické používání ti pomůže při hledání některých záhadných chyb, pokud se například spleteš v identifikátoru metody nebo typu či počtu parametrů.

Kromě toho se v daném případě nejedná o přetěžování, ale o překrývání. Je to rozdíl.

Editováno 25.6.2013 17:30
Odpovědět
25.6.2013 17:28
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Benjibs
Člen
Avatar
Odpovídá na Kit
Benjibs:26.6.2013 13:19

Tak keď pri konštruktore ide o preťažovanie a pri inej metóde (toString()) ide o prekrytie,
existuje nejaká hierarchia, na základe ktorej sa určuje, či ide preťažovanie alebo prekrývanie?

A aký je v praxi medzi preť. a prek. rozdiel?

Odpovědět
26.6.2013 13:19
1 + 1 = 2
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Benjibs
Kit:26.6.2013 13:48

Přetížení je případ, kdy metoda má stejné jméno, ale jiné typy parametrů nebo se liší jejich počet. Přetěžování se děje uvnitř třídy, pokud máš několik metod se stejným názvem.

Překrývání znamená, že nová metoda má stejné jméno i parametry jako metoda rodiče.

Odpovědět
26.6.2013 13:48
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
anonym
Neregistrovaný
Avatar
Odpovídá na Fugiczek
anonym:28.9.2013 8:17

Máš tam chybu, číslo vrátí v <0;cislo), ale zapomněl jsi dodat, že číslo leží v množině přirozených čísel. 2,99 to přeci nevrátí :D

 
Odpovědět
28.9.2013 8:17
Avatar
sisolpes
Člen
Avatar
sisolpes:21.12.2013 20:28

Ještě bych doplnil, že náhodu lze vytvořit také pomocí:
Random pandom = new Random();
int klo = pandom.nextInt(-PARAMETR-);

Editováno 21.12.2013 20:30
Odpovědět
21.12.2013 20:28
Alt + 2
Avatar
hercik11
Člen
Avatar
hercik11:23.12.2013 13:35

Můžu se zeptat jak by se udělala kontrola aby nepadla stejná čísla ?

 
Odpovědět
23.12.2013 13:35
Avatar
Kit
Tvůrce
Avatar
Odpovídá na hercik11
Kit:23.12.2013 13:41

Uložíš si předchozí číslo a porovnáš. K čemu je to dobré?

Odpovědět
23.12.2013 13:41
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Juraj Mlich
Tvůrce
Avatar
Odpovídá na hercik11
Juraj Mlich:23.12.2013 13:41

Všetky čísla, čo už padli si uložíš do List-u a potom iba kontroluješ, či to číslo už padlo (nachádza sa v List-e), ak áno tak vygeneruješ ďalšie a opakuješ dokým nenájdeš vyhovovujúce :)

 
Odpovědět
23.12.2013 13:41
Avatar
Kit
Tvůrce
Avatar
Odpovídá na hercik11
Kit:23.12.2013 13:44

Upřímně řečeno bych byl docela naštvaný, kdyby mi nikdy po sobě nepadly dvě šestky.

Odpovědět
23.12.2013 13:44
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
hercik11
Člen
Avatar
Odpovídá na Kit
hercik11:23.12.2013 14:27

no já jsem to použil jako náhodný generátor číšel a nechci aby se ty čísla opakovala

 
Odpovědět
23.12.2013 14:27
Avatar
Kit
Tvůrce
Avatar
Odpovídá na hercik11
Kit:23.12.2013 14:42

Máš nějaký závažný důvod, proč se ta čísla nemohou opakovat?

Odpovědět
23.12.2013 14:42
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
hercik11
Člen
Avatar
Odpovídá na Kit
hercik11:23.12.2013 14:46

jo protože podle těch náhodných čísel se zobrazují otázky a nechci aby se ty otázky opakovali

 
Odpovědět
23.12.2013 14:46
Avatar
Kit
Tvůrce
Avatar
Odpovídá na hercik11
Kit:23.12.2013 14:49

To se dělá jinak: Vygeneruješ seznam, zamícháš ho a pak vezmeš třeba prvních 10. Nemusíš ho míchat celý, stačí jen těch 10 položek od začátku.

Odpovědět
23.12.2013 14:49
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
sisolpes
Člen
Avatar
sisolpes:27.2.2014 16:35

Proč odkazuje odkaz

V minulém tutoriálu z našeho seriálu o jazyce Java

na první díl těchto návodů, nikoli na druhý?

Editováno 27.2.2014 16:35
Odpovědět
27.2.2014 16:35
Alt + 2
Avatar
lincerix
Člen
Avatar
lincerix:7.3.2014 18:43

Konečně někdo normálně vysvětlil, na co je this. (v) Devbook!

Odpovědět
7.3.2014 18:43
Jsem otřesný programátor - začátečník... Ale nikdy mě nic nebavilo tak moc, jako čučet do Javovského kódu.
Avatar
sisolpes
Člen
Avatar
Odpovídá na hercik11
sisolpes:22.3.2014 12:59

Já toto řešil takto:
Měl jsem otázky v poli, a pak tu otázku, která padla a uživatel na ni odpověděl správně jsem odstranil.

otázky.remove(náhoda);
Editováno 22.3.2014 13:00
Odpovědět
22.3.2014 12:59
Alt + 2
Avatar
t.o.m.a.s.k.o.r.b.a.r:30.3.2014 16:07

Nemohl by mi někdo poradit háže mi to chybu : non-static method can not be referenced from static content. Předem děkuji za pomoc :)

 
Odpovědět
30.3.2014 16:07
Avatar
Jan Demel
Tvůrce
Avatar
Odpovídá na t.o.m.a.s.k.o.r.b.a.r
Jan Demel:30.3.2014 16:08

Pošli nějaký kód :)

Odpovědět
30.3.2014 16:08
To co se zdá být nemožné, je vždy možné.
Avatar
t.o.m.a.s.k.o.r.b.a.r:30.3.2014 16:11
System.out.println(Kostka.vratPocetSten());

u tohodle to háže chybu

public int vratPocetSten()
   {
   return pocetSten;
   }

a takhle je napsaná ta metoda

 
Odpovědět
30.3.2014 16:11
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na t.o.m.a.s.k.o.r.b.a.r
Jan Vargovský:30.3.2014 16:11
System.out.println(new Kostka().vratPocetSten());
 
Odpovědět
30.3.2014 16:11
Avatar
t.o.m.a.s.k.o.r.b.a.r:30.3.2014 16:13

Teď sem to vyřešil musel sem napsat kostka misto Kostka ale i tak děkuji za pomoc :)

 
Odpovědět
30.3.2014 16:13
Avatar
Martin.mak
Člen
Avatar
Odpovídá na Jan Vargovský
Martin.mak:4.5.2014 0:43

Chtělo by to mazání komentářů :) Zase jsem sem napsal kravinu :)

Editováno 4.5.2014 0:44
 
Odpovědět
4.5.2014 0:43
Avatar
simonovsky
Člen
Avatar
simonovsky:9.11.2014 19:27

I po tak dlouhé době, co je zde tento tutorál, sem našel chybu a to konkrétně
v

Kostka sestistenna = new Kostka();
Kostka desetistenna = new Kostka(10);
System.out.println(sestistenna.VratPocetSten());
System.out.println(desetistenna.VratPocetSten());

.VratPocetSten() ma být .vratPocetSten() tzn je tam záměna velké za malé písmenko :)
nicméně se divím, že se nikdo ještě nepřihlásil, že mu to kvůli tomuto nejde? O.o

 
Odpovědět
9.11.2014 19:27
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na simonovsky
David Čápka:9.11.2014 20:18

Díky, opravil jsem :)

Odpovědět
9.11.2014 20:18
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
Avatar
Kulíšek
Člen
Avatar
Kulíšek:30.11.2014 22:12

Skvělé,konečně začínám chápat OOP :O na univezitě to do nás nahustili takovou rychlostí že jsem se ani nestačila vzpamatovat a už to mám někde vysvětlovat profesorovi. Tohle je krásně polopaticky, vážně skvělej nápad :)

 
Odpovědět
30.11.2014 22:12
Avatar
Tomáš Brůna
Tvůrce
Avatar
Tomáš Brůna:13.3.2015 18:57

Ahoj jak se dá udělat aby ta kostka vypsala pouze jedno náhodné číslo?

Odpovědět
13.3.2015 18:57
Vi veri universum vivus vici
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Tomáš Brůna
Jan Vargovský:13.3.2015 19:01

Zavoláš jen metodu hod mimo cyklus.

 
Odpovědět
13.3.2015 19:01
Avatar
Tomáš Brůna
Tvůrce
Avatar
Odpovídá na Jan Vargovský
Tomáš Brůna:13.3.2015 19:09

Funguje děkuju moc :)

Odpovědět
13.3.2015 19:09
Vi veri universum vivus vici
Avatar
B42P6
Člen
Avatar
B42P6:30.4.2015 16:58

Super Diel, ale jednej veci nerozumiem.
Nerozumiem prečo je instancia triedy Random vytvorená v konštruktore, nemohla by byť vytvorená už pri atribútoch.
Moja Kocka:

public class Kocka
{
    private Random r=new Random();

    private int steny;

    public Kocka(int steny)
    {
        this.steny=steny;
    }



    public int hod()
    {
     return r.nextInt(steny)+1;
    }
}
Odpovědět
30.4.2015 16:58
'long long long' is too long for GCC
Avatar
Richard H.
Tvůrce
Avatar
Odpovídá na B42P6
Richard H.:20.7.2015 21:55

Je to jedno oboji udělá to stejné.

Odpovědět
20.7.2015 21:55
Malý užitečný manuál je vždy lepší než bichle k ničemu.
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:6.12.2015 20:18

Pokud vytváříš třídu, tak je to fakt jedno, ale pokud bys tu třídu chtěl vysloveně použít jako pomocníka, tak bys to musel psát do deklarace atributů instance, jak to máš včilkaj ty;), ale to se používá především u návrhových vzorů (např. singleton)

Odpovědět
6.12.2015 20:18
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
blrizzard
Člen
Avatar
blrizzard:18.5.2016 9:27

Pořád nemůžu pochopit co znamená this.prom = prom;. Promena je jen jedna tak v cem se to lisi?

 
Odpovědět
18.5.2016 9:27
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na blrizzard
David Čápka:18.5.2016 9:34

Proměnná není jedna, jsou dvě. Jedna je atribut a druhá parametr. Je to v článku vysvětlené

Java neví, kterou z proměnných myslíme, jestli parametr nebo atribut.

Odpovědět
18.5.2016 9:34
One of the most common causes of failure is the habit of quitting when one is overtaken by temporary defeat.
Avatar
blrizzard
Člen
Avatar
Odpovídá na David Čápka
blrizzard:19.5.2016 9:29

A rozdil mezi parametrem a atributem je jaky?

 
Odpovědět
19.5.2016 9:29
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá na blrizzard
pocitac770:19.5.2016 12:28

Atribut je vlastnost objektu. Máš například instanci typu "člověk", a na ní atribut "věk" věk je vázán na onu instanci, jakmile ji tam dosadíme, tak tam zůstane, dokud ji nepřepíšeme. Parametr je zase jakoby způsob, jak něco udělat, což se váže k metodám a konstruktoru. Když použijeme stejný příklad (člověk), tak každý člověk není ani při zrodu (vytvoření instance) stejný. Nějak se jmenuje, má nějakou výšku, nějakou váhu atd. a to musíme dodat jako parametr při vytvoření, dává nám info, jak modifikovat onen námi nadefinovaný postup. Stejné u metody, například máme metodu "běž". A co s tím? Nic moc zajímavého to asi neudělá, když je to všechno pevně dané. Tak co třeba tam dodat parametry "int vzdalenost, int rychlost, String smer"... To už nám umožní s tou metodou trochu lépe pracovat.

 
Odpovědět
19.5.2016 12:28
Avatar
Jan Mach
Člen
Avatar
Jan Mach:28.9.2016 22:10

chci se zeptat, nějak mi to nefunguje, přitom je to základ, poraďte
1 - v mainu mám jen
B b = new B();

2- v class A je pak

public String jmeno;

public String abc() {
jmeno="jan";
return jmeno;

3-v class B je pak

A a;

public B() {
System.out.prin­tln(a.abc());

 
Odpovědět
28.9.2016 22:10
Avatar
Atrament
Supertvůrce
Avatar
Odpovídá na Jan Mach
Atrament:29.9.2016 0:07

Nemáš tam to a nikde inicializované, chybí ti tam nějaké to

a = new A();
 
Odpovědět
29.9.2016 0:07
Avatar
Semjacko
Člen
Avatar
Semjacko:5.1.2017 23:01

Prečo sme nepoužili metodu Math.random() ? Má to nejaký hlbší zmysel alebo je to úplne jedno ?

 
Odpovědět
5.1.2017 23:01
Avatar
Miroslav Melzer:6.1.2017 11:49

To nastavení atributů na private, aby nešly zvenčí modifikovat, vůbec nevim co si pod tím "zvenčí" představit. Kdybych to měl někomu vysvětlit, tak kde je to venku, kdo tam je?

 
Odpovědět
6.1.2017 11:49
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Miroslav Melzer
Petr Štechmüller:6.1.2017 12:10

Ahoj, vysvětlím Ti to na příkladu z tutoriálu. Mějme třídu Kostka:

public class Kostka {
        /** Generátor náhodných čísel */
        private Random random;
        /** Počet stěn kostky */
        private int pocetSten;
...
}

Třída Kostka má dva privátní atributy random a pocetSten. Privátní znamená, že ho nelze zvenčí modifikovat, jinými slovy, nemůžeš někde v uživatelském kódu použít tuto konstrukci:

Kostka kostka = new Kostka(); // Pouze definuji instanci kostky
kostka.pocetSten = 5; // Toto nelze použít = volání zvenčí
kostka.setPocetSten(5); // Pokud bude mít kostka setter, tak takto by se měl nastavit požadovaný počet stěn
Odpovědět
6.1.2017 12:10
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Miroslav Melzer:6.1.2017 12:12

Takže "venku/zvenčí" je to, pod metodou main?

 
Odpovědět
6.1.2017 12:12
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Miroslav Melzer
Petr Štechmüller:6.1.2017 12:16

Ano. Třeba si představ, že vytváříš nějakou knihovnu. Zvenčí by znamenalo uživatel, který si tvoji knihovnu stáhl a používá.

Odpovědět
6.1.2017 12:16
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Odpovídá na Petr Štechmüller
Miroslav Melzer:6.1.2017 12:19

Jo díky, už mi to začíná bejt jasný. Ono je to taky hned v tom prvním článku, kde je vysvětlený zapouzdření, ale nějak jsem to pozapomněl...

 
Odpovědět
6.1.2017 12:19
Avatar
pocitac770
Tvůrce
Avatar
Odpovídá na Miroslav Melzer
pocitac770:6.1.2017 14:32

Hlavně je to ohledně zachování konzistentnosti programu, je pravda, že jasné to začíná být ve chvíli, kdy tvůj kód použije jiný uživatel, který nemá nejmenší tušení, jak to uvnitř funguje, a nechceš, aby tam něco nerozbil, ale představ si, že se tím uživatelem staneš ty, když chceš kód použít po třeba roku :D
Více bude zapouzdření popsané v 10. lekci i s názorným příkladem, co tou konzistentností myslím

 
Odpovědět
6.1.2017 14:32
Avatar
Odpovídá na Semjacko
Peter Gasparik:16.2.2017 12:38

Pretoze Math.random() generuje od 0 do 1 myslim, ze v rovine realnych cisel (napr0,03658945 atd) ... museli by sme potom este pridat nasobenie a zaokruhlovanie.

Aspon myslim, ze som to dobre objasnil :).

Odpovědět
16.2.2017 12:38
while (noSuccess) { tryAgain(); if (Dead) break;
Avatar
Semjacko
Člen
Avatar
Semjacko:17.2.2017 17:04

Hej hej už to chápem... V konečnom dôsledku by to teda bolo vlastne to isté :)

 
Odpovědět
17.2.2017 17:04
Avatar
Tomáš Kala
Člen
Avatar
Tomáš Kala:24.5.2017 14:01

neměl by u té první (šestistěnné) kostky ten cyklus končit v 6? jaktože má stejný počet hodnot jako ta desetistěnná?

 
Odpovědět
24.5.2017 14:01
Avatar
gcx11
Tvůrce
Avatar
Odpovídá na Tomáš Kala
gcx11:24.5.2017 14:23

Pokud by končil v 6, tak by vypsal jenom šest hodnot, takto jich vypíše těch deset.

 
Odpovědět
24.5.2017 14:23
Avatar
Jakub kožich:20.7.2017 14:42

Protoze for cyklus co jde od 0 do 9, proto ma stejny pocet hodu jako desetistenna.. Neplet si pocet sten a pocet hodu :)

 
Odpovědět
20.7.2017 14:42
Avatar
Karel Dyntar
Člen
Avatar
Karel Dyntar:7.9.2017 20:54

Zdravím. Jak bych tam mohl přidat možnost zadání vlastního číselného rozsahu, ze kterého by se generoval určitý počet náhodných čísel?

 
Odpovědět
7.9.2017 20:54
Avatar
Marek Zelený
Tvůrce
Avatar
Odpovídá na Karel Dyntar
Marek Zelený:22.10.2017 17:33

Ahoj, s Javou teprve začínám, ale jestli jsem to správně pochopil, Java ti umožňuje určit jen horní hranici rozsahu (narozdíl třeba od C#, kde můžeš určit i spodní hranici). Takže pokud chceš generovat náhodná čísla např. od 20 do 29, musíš vygenerovat číslo od 0 do 9 a přičíst k němu 20:

random.nextInt(10) + 20

Editováno 22.10.2017 17:34
 
Odpovědět
22.10.2017 17:33
Avatar
Roman
Člen
Avatar
Roman:24.10.2017 5:39

Od Javy 1.7 muzes vyuzit:

import  java.util.concurrent.ThreadLocalRandom;
ThreadLocalRandom.current().nextInt(min, max + 1);
 
Odpovědět
24.10.2017 5:39
Avatar
MiroslavP
Člen
Avatar
MiroslavP:10.3.2018 17:15

Poutavé, názorné, skvělé :-)

 
Odpovědět
10.3.2018 17:15
Avatar
Mino19
Člen
Avatar
Mino19:12.7.2018 16:18

Mám problém,stále dostanem výpis ako je na obrázku a nie to čo mám dostať.Viem ze mi tam chýba @Override ale ak to tam vložím tak vyhadzuje chybu.

TahovyBoj :

package tahovyboj;


public class TahovyBoj {


    public static void main(String[] args) {


        Kocka seststenna = new Kocka();
        Kocka desatstenna = new Kocka(10);


        System.out.println(seststenna);
        for (int i = 0; i < 10; i++){
            System.out.print(seststenna.hod() + " " );
        }

        System.out.println("\n\n" + desatstenna);
        for (int i = 0; i < 10; i++){
            System.out.print(desatstenna.hod() + " ");
        }


    }

}

Kocka :

package tahovyboj;

import java.util.Random;
import java.lang.Object;


public class Kocka {

    private Random random;
    private int pocetStien;


    public Kocka() {
    pocetStien = 6;
    random = new Random();
    }

    public Kocka(int PocetStien){
        this.pocetStien = PocetStien;
        random = new Random();
    }




    public int vratPocetStien() {
        return pocetStien;




  }

     public int hod(){
        return random.nextInt(pocetStien) + 1;
    }

     public String toSting(){
        return String.format("Kocka so %s stenami ", pocetStien);

     }
}
 
Odpovědět
12.7.2018 16:18
Avatar
Odpovídá na Mino19
Matúš Olejník:12.7.2018 17:06

@Override anotácia ti len pre prehľadnosť označuje že ideš zmeniť správanie nejakej metódy ktorú si zdedil. Keďže ti však vyhadzuje chybu keď tú metódu tak označíš je to znak toho že si ju nezdedil a v tvojom prípade to je skutočne tak pretože originálna metóda ktorú si zdedil má názov toString a tvoja sa volá toSting - máš tam preklep chýba ti tam "r". Stačí ju premenovať a môžeš pridať aj anotáciu.

Odpovědět
12.7.2018 17:06
/* I am not sure why this works but it fixes the problem */
Avatar
Mino19
Člen
Avatar
Odpovídá na Matúš Olejník
Mino19:12.7.2018 17:10

Och..ďakujem

 
Odpovědět
12.7.2018 17:10
Avatar
Jiří S.
Tvůrce
Avatar
Jiří S.:28.12.2018 18:14

Jsem z toho blbej :-? , ale tak třeba to postupem času jak budu více zkušenější poberu :-) .

 
Odpovědět
28.12.2018 18:14
Avatar
Vít Vlach
Člen
Avatar
Odpovídá na Jiří S.
Vít Vlach:28.12.2018 20:31

A co nechápeš? :-)

Odpovědět
28.12.2018 20:31
My code doesn't work. Let's change nothing and run it again.
Avatar
Jiří S.
Tvůrce
Avatar
Odpovídá na Vít Vlach
Jiří S.:29.12.2018 16:56

Asi té metodě random. Četl jsem sice o javě knížku ale tohle tam nebylo. Taky je pravda že včera jsem byl už unavený a tolik jsem se na to nesoustředil, takže to bude asi i tím. :D

 
Odpovědět
29.12.2018 16:56
Avatar
Marcel Mares
Člen
Avatar
Marcel Mares:18.7.2019 11:41

Dobrý den, já mám takový nedůležitý dotaz, proč se v : return String.format("Kos­tka s %s stěnami", pocetSten) nepoužije místo %s radši %d, když pocetSten je int, to znamená že obsahuje jen celá čísla a v základech Java jsem se učil, že %s se používá pro řetězce String, %d pro celá čísla a %f pro desetinná čísla...předem děkuji za odpověď...

 
Odpovědět
18.7.2019 11:41
Avatar
Marcel Mares
Člen
Avatar
Odpovídá na Marcel Mares
Marcel Mares:19.7.2019 12:18

tak jsem si dosadil všechny 3 typy, v případě %f program proběhl, ale konzole vypsala chybu, že se nejedná o desetinná čísla, při %d vše proběhlo v pořádku a obě kostky generovaly 10 náhodných čísel, stejně jako za použití %s, znamená to tedy, že v javě dochází k automatické skryté konvezi celých čísel na řetězec pomocí String.valueOf, proč to ale také ta konverze nefunguje pro ty desetinné čísla ...

 
Odpovědět
19.7.2019 12:18
Avatar
Branislav Budoš:21.1.2020 10:16

Pekný deň prajem. Nejde mi do hlavy jedna vec a to:
musí byť vo finálnom programe v triede tento kód? Pretože podla mňa nie. A keď ho vymažem pokusne z triedy tak program pekne zbehne.

public int vratPocetSten() {
    return pocetSten;
    }

Ďakujem za odpoveď.

 
Odpovědět
21.1.2020 10:16
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Branislav Budoš
Petr Štechmüller:21.1.2020 11:47

Není dobré atribut nastavit na public, protože nebudeme chtít, aby nám někdo mohl již u vytvořené kostky měnit počet stěn. Přidáme do třídy tedy metodu vratPocetSten(), která nám vrátí hodnotu atributu pocetSten. Docílili jsme tím v podstatě toho, že je atribut read-only (atribut není viditelný a lze ho pouze číst metodou, změnit ho nelze).

Odpovědět
21.1.2020 11:47
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Jan Béňa
Člen
Avatar
Jan Béňa:29.1.2020 18:21

Ahoj všem.
Asi bych potřeboval poradit. Snažil jsem se udělat program, který by vygeneroval mezi sebou dvě náhodné čísla a ty pak porovnal mezi sebou. Pokud by jedno bylo větší přičetl by +1 do proměnné třeba a v opačném případě do b. při rovnosti nic. Snažil jsem se to naprogramovat pomocí OOP a vše funguje jak jsem popsal. Ovšem když to dám do cyklu tak to vygeneruje jednou náhodně a pak to vezme první náhodné generování. Nějak nemůžu docílit toho, aby to vždycky vygenerovalo nové čísla do cyklu tak že mám vždy jen tři výsledky.(1:0,0:1 nebo 0:0). Myslím že pokud jsem došel sem, měl bych to zvládnout, akorát už se s tím lámu týden a pořád nic. Mohl by mi když tak nějaký zkušený borec dát nějaký tip aby mě nasměroval. Děkuji mockrát.

 
Odpovědět
29.1.2020 18:21
Avatar
Odpovídá na Jan Béňa
Matúš Olejník:29.1.2020 20:14

Ahoj, prihoď sem aj tvoj kód, so vstupom a požadovaným výstupom. Najlepšie by však bolo keby vytvoríš nové vlákno vo fóre pre Javu kde môžme viacej písať. Keď už sa s tým se#ieš týždeň nech to dokončíš :D

Odpovědět
29.1.2020 20:14
/* I am not sure why this works but it fixes the problem */
Avatar
Jan Béňa
Člen
Avatar
Odpovídá na Matúš Olejník
Jan Béňa:29.1.2020 20:17

Ok zkusím vytvořit vlákno na fóru.

 
Odpovědět
29.1.2020 20:17
Avatar
Gemy
Člen
Avatar
Gemy:25.3.2020 15:58

Jak dokáže stroj generovat náhodná čísla? Odkud je matematicky bere?

Odpovědět
25.3.2020 15:58
Člověk stvořil logiku, a proto jedná v afektu.
Avatar
Alesh
Překladatel
Avatar
Odpovídá na Gemy
Alesh:25.3.2020 18:45

Nejedná se o náhodná čísla, ale o pseudonáhodná, protože jak správně tušíš, stroj nemůže "vymyslet" náhodné číslo. Laicky vysvětleno to funguje tak, že se vezme systémový čas, ten se vynásobí velkým prvočíslem a dále se to upravuje tak, aby vypadlo číslo z požadovaného intervalu.
Odborné vysvětlení najdeš na netu, třeba na Wikipedii, viz Generátor náhodných čísel.

Editováno 25.3.2020 18:46
 
Odpovědět
25.3.2020 18:45
Avatar
Aleš Fiala
Člen
Avatar
Aleš Fiala:29.6.2020 17:13
Exception in thread "main" java.lang.StackOverflowError
        at tahovyboj.Kostka.<init>(Kostka.java:16)
        at tahovyboj.Kostka.<init>(Kostka.java:16)
        at tahovyboj.Kostka.<init>(Kostka.java:16)
        at tahovyboj.Kostka.<init>(Kostka.java:16)
        at tahovyboj.Kostka.<init>(Kostka.java:16)
        at tahovyboj.Kostka.<init>(Kostka.java:16)
        at tahovyboj.Kostka.<init>(Kostka.java:16)
        at tahovyboj.Kostka.<init>(Kostka.java:16)
C:\Users\Lenovo\AppData\Local\NetBeans\Cache\12.0\executor-snippets\run.xml:111: The following error occurred while executing this line:
C:\Users\Lenovo\AppData\Local\NetBeans\Cache\12.0\executor-snippets\run.xml:94: Java returned: 1
BUILD FAILED (total time: 3 seconds)
Editováno 1.7.2020 11:12
 
Odpovědět
29.6.2020 17:13
Avatar
Aleš Fiala
Člen
Avatar
Odpovídá na Aleš Fiala
Aleš Fiala:29.6.2020 17:26

Jak už tu někdo psal: Už si z toho sypu popel nad hlavu. Stačilo jen dát u druhé třídy Clean and Build. Jak se dá tohle dlouhý smazat? :)

 
Odpovědět
29.6.2020 17:26
Avatar
Ondra Hájek
Člen
Avatar
Ondra Hájek:22.12.2020 20:47

Ahoj, je tu někdo zkušený kdo by se podíval na moje řešení? Někde jsem okoukal řetězení konstruktorů. Znamená to, že pokud zavolám konstruktor bez argumentu, ten následně zavolá konstruktor druhý a dosadí defaultní hodnotu argumentu? Chápu to správně? Viz kód.
Díky, Ondra

import java.util.Random;

public class Kostka {

    private int pocetSten;
    private Random random;

    public Kostka(int pocetSten) {
        this.pocetSten = pocetSten;
        this.random = new Random();
    }

    public Kostka() {
        this(6);
    }

    public int getPocetSten() {
        return this.pocetSten;
    }

    @Override
    public String toString() {
        return "Kostka{" +
                "pocetSten=" + this.pocetSten +
                '}';
    }

    public int randomNumber() {
        return random.nextInt(this.pocetSten) + 1;
    }
}
 
Odpovědět
22.12.2020 20:47
Avatar
Atrament
Supertvůrce
Avatar
Odpovídá na Ondra Hájek
Atrament:23.12.2020 10:23

Chápeš to správně, ale asi bych se tomu vyhnul, osobně nemám tohle řetězení konstruktorů rád. U jednoduchého příkladu, kdy nastavuješ jednu defaultní hodnotu je to ještě v pohodě, ale jakmile chceš nastavovat více defaultních hodnot, tak se do toho můžeš velice snadno zamotat. V tom případě je mnohem lepší použít Builder Pattern...

 
Odpovědět
23.12.2020 10:23
Avatar
Karel Stehlík:4.1.2021 23:46

Návrhové vzory jsou pokročilejší technika. Pro ty, kteří se ale s OOP teprve seznamují, je využití klíčového slova "this" při přetěžování konstruktorů ideální obrana před duplikováním kódu.

Ondro, pokud se název atributu objektu nedá zaměnit s názvem lokální proměnné - typicky u konstruktoru jeho parametrem, není nutné klíčové slovo "this" před atributem uvádět.

 
Odpovědět
4.1.2021 23:46
Avatar
Robert Vyskup:20.8.2021 16:21

Potřebuju vysvětlit proč je potřeba v programu třídy Kostka

private int pocetsten;
    private Random random;
    public Kostka(int pocetsten){
        this.pocetsten=pocetsten;
        random = new Random();
    }
    public int vratPocetsten(){
        return pocetsten;
    }
    public int hod(){
        return random.nextInt(pocetsten)+1;
    }

tento kód

public int vratPocetsten(){
        return pocetsten;

A to i v případě kdy nepotřebuju a nechci vracet ve výpisu údaj o počtu stěn. Vidím, že tato metoda má vliv na samotný hod kostkou, který se bez ni neprovede. Jak to? Souvisí to s tím, že pokud chci dostat počet stěn zadaný v instanci třídy Kostka do privátního atributu pocetsten tak musím jít skrze tuto metodu, jelikož přes konstruktor se tam nedostane?

 
Odpovědět
20.8.2021 16:21
Avatar
Atrament
Supertvůrce
Avatar
Odpovídá na Robert Vyskup
Atrament:20.8.2021 17:38

Jak to myslíš, že má ta metoda vliv na hod kostkou a že se bez ní neprovede? Nic takového tam nevidím, metoda hod() metodu vratPocetsten() vůbec nepoužívá

Editováno 20.8.2021 17:41
 
Odpovědět
20.8.2021 17:38
Avatar
Atrament
Supertvůrce
Avatar
Odpovídá na Robert Vyskup
Atrament:20.8.2021 17:50

Jinak ta metoda vratPocestSten() je v článku vysvětlena, prostě vrací hodnotu pocetsten

 
Odpovědět
20.8.2021 17:50
Avatar
Robert Vyskup:20.8.2021 19:01

Jo už to vidím, mně tam zbyla, jak jsem to mazal jedna složená závorka navíc. Proto to bylo červené. Měl jsem to líp prozkoumat ;-)

 
Odpovědět
20.8.2021 19:01
Avatar
Odpovídá na Atrament
Robert Vyskup:20.8.2021 19:07

Mně to zmátlo jak jsem zkoumal tu třídu Bojovnik. Kde máme metody

private void nastavZpravu(String zprava){
        this.zprava=zprava;
    }
    public String vratPosledniZpravu(){
        return zprava;
 
Odpovědět
20.8.2021 19:07
Avatar
Odpovídá na Atrament
Robert Vyskup:20.8.2021 19:14

Proč nestačí v té třídě Bojovnik vrátit tu zpávu takto:

public String toString(){
return zprava;
}

a jsou tam místo toho ty dvě metody?

 
Odpovědět
20.8.2021 19:14
Avatar
Atrament
Supertvůrce
Avatar
Odpovídá na Robert Vyskup
Atrament:20.8.2021 19:28

Protože toString() slouží k něčemu úplně jinému

 
Odpovědět
20.8.2021 19:28
Avatar
Odpovídá na Atrament
Robert Vyskup:20.8.2021 19:44

No ale kdybychom dali na začátku do konstruktoru i atribut zprava a v parametru měli i String zprava, tak by se nám pak přece přes toString ta zprava vrátila, a my bychom ji pak mohli vypsat v konzoli. Jasně pár dalších věcí, které jsou v programu napojeny na ty dvě metody by se muselo přepsat na atribut zprava, ale pak by to snad fungovalo, ne?

 
Odpovědět
20.8.2021 19:44
Avatar
Atrament
Supertvůrce
Avatar
Odpovídá na Robert Vyskup
Atrament:20.8.2021 19:52

toString() ale vypisuje jméno bojovníka, to nemá se zprávou vůbec co dělat a ta zpráva se přece vytváří a mění až v průběhu boje, takže dělat s ní cokoliv v konstruktoru je nesmysl od toho jsou tam ty dvě metody přímo na zpracování zprávy

 
Odpovědět
20.8.2021 19:52
Avatar
Odpovídá na Atrament
Robert Vyskup:20.8.2021 20:14

No a co kdybychom to napsali takto:

public String vratZpravu(String zprava){
        this.zprava=zprava;
        return zprava;
}

takto bychom místo dvou metod měli jednu. Samozřejmě všude bychom museli změnit vratPosledniZpravu a nastavZpravu na vratZpravu. Ale pak by to snad mohlo fungovat ne?

 
Odpovědět
20.8.2021 20:14
Avatar
Odpovídá na Atrament
Robert Vyskup:20.8.2021 20:46

Tak už vidím proč to nejde. V main třídě ze které vypisujem to chce String a to co jsem vytvořil nebere jako String. No radši už toho nechám ;-) Ale aspoň jsem to zase pochopil o kus dál. Díky za pomoc.

 
Odpovědět
20.8.2021 20:46
Avatar
Atrament
Supertvůrce
Avatar
Odpovídá na Robert Vyskup
Atrament:21.8.2021 8:53

Právě jsi na pouhých třech řádcích kódu porušil dvě nejzákladnější pravidla při psaní metod :) A sice

  1. metody mají vždy dělat pouze jednu jedinou věc
  2. jméno metody má vždycky přesně říkat co daná metoda dělá

Tebou stvořená metoda vratZpravu nyní kromě vracení zprávy ještě i zprávu nastavuje, o čemž v jejím jméně není ani zmínka.

Vždycky je lepší mít více metod dělajících každá jednu věc, než jednu metodu, která dělá více věcí najednou. Jak bys třeba teďka s touto metodou postupoval, kdybys chtěl jenom nastavit zprávu a nic víc?

 
Odpovědět
21.8.2021 8:53
Avatar
Nadšenec Ajťákový:19.10.2021 14:14

Metodu již jednoduše nedefinujeme, ale protože již exituje, musíme ji přepsat, resp. překrýt.

Předpokládám, že tam mělo být slovíčko existuje. Pokud tedy tu metodu nechcete nechat zemřít :-D ;-)

Editováno 19.10.2021 14:15
 
Odpovědět
19.10.2021 14:14
Avatar
Petr Štěpánek:2. ledna 16:21

Jediný ze všech článků, kde jsem se ztratil, a to v okamžiku, kdy píšeš "K projektu si přidejme novou class s názvem Kostka". Až postupně mi došlo, že to je ve stromu, nikoli přímo v kódu. Taky mi hned neseplo, že půlené okno s kódem má napravo obsah podle toho, na kterou metodu kliknu nalevo

 
Odpovědět
2. ledna 16:21
Avatar
Jaroslav Drobek:3. února 17:43

"zkuste se podívat např. na metodu indexOf() na třídě String"...jak to udělat? Ani na vytvořenou třídu Kostka nereaguje NetBeans vždy vyrolováním možností - musí být napsána v určitém kontextu, uchází mi v jakém.

"Zde bychom hráči pomocí this předali sebe sama, tedy tu konkrétní kostku"..to nedává smysl, ikdyž asi tuším, co to má znamenat

 
Odpovědět
3. února 17:43
Avatar
Atrament
Supertvůrce
Avatar
Odpovídá na Jaroslav Drobek
Atrament:4. února 11:50

Prostě napiš název nějaké String proměnné nebo přímo nějaký string a za něj tečku a otevře se ti ta nabídka:

String slovo;
slovo.
"slovo".
//v obou případech se po napsání tečky otevře nabídka

samozřejmě je to citlivé na kontext, kde to píšeš, prostě to nabízí to, co dává smysl v daném místě.

 
Odpovědět
4. února 11:50
Avatar
Ondřej Raška:2. srpna 19:13

Pro začátečníka příliš mnoho informací na příliš malém prostoru.

 
Odpovědět
2. srpna 19:13
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 99 zpráv z 99.