Trieda slúži na opis a výrobu objektov. Skúsme porozmýšľať nad reálnym objektom – napríklad auto. Ak chceme opísať auto do programu, tak na opis auta použijeme triedu.
Čo má auto? Aké vlastnosti? Má počet dverí, značku, ečv, objem kufra a ďalších xy vecí. Nie všetky budeme používať.
Vytvorme si triedu Auto.
class Auto {
}
Na základe tejto triedy si vytvoríme nový objekt typu Auto.
val auticko = Auto()
Na výrobu objektov budeme používať konštruktor. Konštruktor ako názov naznačuje slúži na skonštruovanie nového objektu.
Bez toho aby si ty sám napísal nejaký konštruktor, tak máš jeden dostupný automaticky. Tento sa volá – bezparametrický konštruktor – je to akoby metóda, ktorá na vstupe nemá parametre. Preto je možné vyrobiť nový objekt pomocou Auto()
Vytvorme si ale konštruktor, ktorý vytvorí Auto s názvom. Vedľa názvu triedy napíšeme constructor zátvorky a do zátvoriek dáme premennú a typ.
class Auto constructor(nazov: String) {
}
Teraz vieme zavolať vytvorenie auta pomocou nového konštruktoru:
val auticko = Auto("Skoda")
Všimni si, že pôvodný bez parametrický konštruktor nemáme dostupný. Teraz nedokážem vytvoriť nové auto pomocou Autu(), pretože tento konštruktor bol doplnený len ak som nezadal žiaden iný konštruktor. Ak ale predsa len chceme bez parametrický konštruktor musíme ho doplniť.
Teraz sme do zavolania konštruktoru poslali String Skoda. Kde sa ale tento String uloží? To musíme špecifikovať.
Tu je rozdiel od vytvorenie Osoby, ako sme to robili pred tým. Vytvoríme si teda premennú v triede s názvom a typom. Táto premenná je globálna v triede. Je dostupná všetkým metódam v danej triede. Ale ak je globálna musí mať hodnotu, lebo hocikde v nejakej metóde k nej môžeme pristúpiť.
class Auto constructor(nazov: String) {
val nazov: String
}
Akú hodnotu tam chcem dať? Tú hodnotu, ktorá prišla do konštruktoru. Túto hodnotu viem využiť v bloku kódu init.
class Auto constructor(nazov: String) {
val nazov: String
init {
this.nazov = nazov
}
}
Takto napísaný konštruktor mimo kučeravých zátvoriek triedy sa nazýva privátny konštruktor. K tomu si niečo ešte povieme.
Ak používame primárny konštruktor a chceme využiť nazov, ktorý mi prišiel do konštoru, tak na to využijmee init blok, ktorý sa volá iba raz pri vytvorení objektu.
Tu vo vnútri sa cez príkaz this odvolávame na tento novo vytvorený objekt a tomuto novému objektu nastavujem nazov hodnotou, ktorú som poslal do konštruktoru pod názvom nazov.
Ak by sa premenná v konštruktore volal inak, tak nemusím volať this.
class Auto constructor(nazov2: String) {
val nazov: String
init {
nazov = nazov2
}
}
Tento spôsob je zdĺhavý a pracuje podobne ako v jave.
Kratší spôsob je odstránenie init bloku a pridanie hodnoty priamo z konštruktoru do globálnej premennej.
class Auto constructor(nazov2: String) {
val nazov: String = nazov2
}
Načo je konštruktor – na presunutie hodnoty do globálnej premennej. Stále opakujem toto jednoduché. Preto to v Kotline vieme ešte viac uľahčiť.
Zmažeme globálnu premennú (property) a do konštruktoru pridáme pre nazov2 val a meno zmeníme na nazov. Teraz Kotlin na pozadí vytvorí property a nastaví mu hodnotu, nám stačí napísať:
class Auto constructor(val nazov: String) {
}
Teraz to vieme ešte viac zjednodušiť, tým, že odstránime slovo constructor:
class Auto (val nazov: String) {
}
Týmto spôsobom sme vytvorili jeden primárny konštruktor.
Často sa ale stáva, že chceme objekt vytvoriť a podstrčiť mu rôzne premenné, napríklad názov a počet dverí. Vieme vytvoriť ďalší konštruktor:
class Auto (val nazov: String) {
constructor(nazov: String, pocetDveri: Int){
}
}
Tento konštruktor požaduje, aby sa zavolal primárny konštruktor, ak sme ho zadefinovali. Tento primárny konštruktor zavoláme ak za zátvorkou dáme dvojbodku a napíšeme this(nazov). Čo sa stalo? This sa odvolá na konštruktor, ktorý má presne jeden String parameter. Zavolá sa primárny konštrukor a posunie sa do neho premenná nazov z tohto sekundárneho konštruktoru.
class Auto (val nazov: String) {
constructor(nazov: String, pocetDveri: Int) : this(nazov){
}
}
Tu si treba zapamätať, že sekundárne konštruktory nám na pozadí nenastavia hodnoty na globálne premenné. Teda nazov sa posunie do primárneho konštruktoru a tam sa nastaví na property nazov a môžem urobiť nad objektom auto.nazov. Ale pocetDveri sa neposúva do primárneho konštruktoru a teda pocetDveri nie je dostupný ako auto.pocetDveri.
Musíme vytvoriť vlastnú property v triede (globálnu premennú).
class Auto (val nazov: String) {
val pocetDveri: Int
constructor(val nazov: String, val pocetDveri: Int){
}
}
PocetDveri nesmie byť ne-inicializovaný – musíme mu pridať hodnotu a to spravíme pomocou pridania hodnoty na priamo alebo v init bloku.
class Auto (val nazov: String) {
var pocetDveri: Int = 4
constructor(nazov: String, pocetDveri: Int) : this(nazov){
}
}
Ak hodnota príde v sekundárnom konštruktore, tak ju nastavíme na property:
class Auto (val nazov: String) {
var pocetDveri: Int = 4
constructor(nazov: String, pocetDveri: Int) : this(nazov){
this.pocetDveri = pocetDveri
}
}
Teraz vieme auto vytvoriť pomocou oboch konštruktorov.
val auticko = Auto("Skoda")
val skoda = Auto("Skoda", 5)
println(skoda.nazov)
println(skoda.pocetDveri)
Je možné dosiahnúť to, aby som vytvoril objekt dvomi spôsobmi bez toho aby som musel napísať nový sekundárny konštruktor. Teda môžem spraviť toto pomocou jedného konštruktoru?:
val auticko = Auto("Skoda")
val skoda = Auto("Skoda", 5)
Odpoveď je áno a to tak, že všetky property napíšeme v primárnom konštruktore ale hodnotám, ktoré sa nemusia vždy vyplniť dáme default hodnotu.
Triedu Auto prerobíme takto:
class Auto (val nazov: String, val pocetDveri: Int = 4) {
}
Aj sekundárne konštruktory môžu obsahovať default hodnoty.
Ak v triede neexistuje primárny konštruktor, tak môžeme vytvoriť sekundárny konštruktor a nemusíme pomocou dvojbodky volať nič.
class Skuska{
val daco: Int;
constructor(){
this.daco = 4;
}
}
IDEA nám dáva ponuku prerobiť to na primárny konštruktor:
class Skuska() {
val daco: Int;
init {
this.daco = 4
}
}
Najnovšie články
- Písanie kódu – programovanie v Jave
- Naprogramuj si vlastnú Android aplikáciu v jazyku Kotlin
- Divi scroll efekty
- Dizajnujem web v Divi téme (WordPress)
- Divi najlepšia WordPress téma – 9 dôvodov prečo ju používať (2020)
Páčil sa ti článok? Zváž zdieľanie. Ďakujeme.