Diskuze: Úkol 4 - Reference na instance objektu
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 5 zpráv z 5.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Předně, není to moc dobře naprogramováno.To jsi vytvořil ty nebo to je vzorové řešení? teď si to už nepamatuju.
Zkusím to trošku zobecnit.
Reference = odkaz na něco.
Základem všeho je proměnná. Proměnná se skládá z:
Pokud máš proměnnou s primitivním datovým typem, tak tato hodnota je naplněná vždy konečnou hodnotou (nemůžeš na to už volat jiné metody a tato hodnota už je prostě konečná a nebude se nijak rozvíjet. Můžeš ji leda měnit, pracovat s ní, ale to je tak vše).
No a pak máš proměnná, která má uloženou REFERENCI (odkaz) na nějaký objekt.
Trošku názorně, abys viděl konkrétní příklady:
Máš proměnnou s priminitivním datovým typem (mimochodem, existuje pouze 8 primitivních datových typů, to jen tak pro info).
private int number = 4;
Vidíš sám, že tato proměnná má konkrétní hodnotu. Není to reference
(odkaz na objekt), ale hodnota.
(Trocha filozofie.... kupříkladu JavaScript bere úplně všechno jako objekt,
takže on by dokázal říct, že třeba ta čtverka je také objekt, ale v
Javě, i když je Java ryze objektová, tak se toto rozlišuje).
Takže prostě a jednoduše - proměnná neodkazuje na referenci (na žádný
objekt), takže už nemůžeš volat na ní žádné metody.
Nemůžeš zavolat ani třeba:
number.toString();
Naproti tomu, proměnná objektového datového typu uchovává v sobě ne
hodnotu, ale REFERENCI (odkaz) na objekt.
Takže když máš třeba:
private Hrad hrad = new Hrad();
tak v proměnné hrad máš v podstatě schovaný objekt.
Proměnná objektového datového typu může dokonce už nabývat hodnoty null
- to je také rozdíl třeba mezi nulou a null. Nula je konkrétní hodnota.
Null znamená, že odkazuješ na žádný objekt.
A teď k tvému příkladu.
Úplně za prvé... pokud k tomu nemáš skutečně dobrý důvod a ty
důvody prakticky už dneska skoro neexistují, protože se dá většinou
najít čistčí řešení, tak nepiš proměnné s modifikátorem přístupu
public.
Zapamatuj si konvenci, že proměnná se píše prioritně private.
Takže teď už bys mohl vědět odpověď na 1. bod
Ne, v uvedeném příkladu nevytváříš žádnou referenci.
Ono se to trošku rozděluje.
To, co jsi uvedl, tak je právě deklarace. Deklarace znamená, že pouze někde uvedeš, že vytváříš proměnnou. Deklarace tedy znamená: modifikátor přístupu, datový typ a název. Nic víc
Potom je právě inicializace. To prostě ber tak,že napíšeš rovnítko a buď napíšeš konkrétní hodnotu (v případě primitivních datových typů) nebo buď vytvoříš nový objekt a nebo použiješ stávající (to v případě objektového datového typu). V případě objektového datového typu uložíš do proměnné referenci na objekt.
V bodě 2 ano, vytváříš nové objekty a uložíš je (získáš referenci na ně) do proměnných.
k dalším bodům se vyjádřím v dalším komentáři, ať to není dlouhé
u třetího bodu to říkáš špatně. Ne do referencí, ale do proměnných
uložíš reference.
A pro tvoje info. Toto je čuňárna, o které jsem mluvil. Říká se tomu
zapouzdření. Je nebezpečné, aby k atributům třídy měla přístup jiná
třída. Toto se řeší přes tzv. přístupové metody (settery, gettery).
Kdyby tě to zajímalo, mohl bych ti pak o tom víc napsat i s konkrétními
příklady.
4. bod - ne není vytvořena reference. aktuálníLokace je opět proměnná, která uchovává v sobě referenci.(vždy aktuální vybranou lokaci).
5. bod. Máš tam 2 podmínky (obě rozvětvené). Pokud bude splněna
první,přejde se k druhé. Pokud nebude, tak se metoda ukončí.
Možná by se sem víc hodila rekurze, než ukončovat takhle metodu a pak ji
provolávat, ale to je na uvážení programátora.
V případě, že se první podmínka splní v první větvi a přejde se do další větve, tak se prochází další podmínka, která v jednotlivých případech nastaví referenci na lokaci do proměnné aktualniLokace (podle toho, jakou volbu zvolíš).
6. bod, kterému nerozumíš.
To je jedna z přístupových metod, o které jsem i mluvil. Je to tzv. getter
nebo getMetoda. Anglicky se vrat řekne get
Tato metoda je návratová. Návratová metoda nemá void, ale datový typ,
který vrátí. V podstatě je to právě ta čistá varianta, o které jsem
mluvil. Neodkazuješ se přímo na proměnnou aktualniLokace, ale použiješ
referenci v této proměnné přes tuto metodu.
Může se zdát, že je to zbytečné, dalo by se místo metody vratAktualniLokaci() používat přímo proměnnou aktualniLokace - viz příklad:
private Lokace aktualniLokace = new Lokace()
public Lokace getAktualniLokace() {
return aktualniLokace;
}
public void metoda() {
//A nyní můžeš napsat:
System.out.println(getAktualniLokace());
//A nebo:
System.out.println(aktualniLokace);
// Dostaneš ten samý výsledek
}
Proč to tak je přes tyto metody, tak s tím souvisí teorie a koncept OOP. Jestli bys měl zájem, můžu ti o tom teda napsat víc.
Víc ještě o rozdílu mezi referencí a hodnotou najdeš zde. Nenašel jsem
doteď lepší článek, který by to lépe vystihl. Je skutečně nádherně
zpracován a nevytkl bych tomu ani čárku mezi větou.
https://www.itnetwork.cz/…ge-collector
Zobrazeno 5 zpráv z 5.