Zmienne – val i var

Zmienne to podstawowy sposób przechowywania danych w programie. Poznasz dwa słowa kluczowe – val i var – nauczysz się, czym się różnią, jak Kotlin sam rozpoznaje typ wartości oraz kiedy warto podać typ samodzielnie.

val var inferencja typów Lekcja 1.1
1

Czym jest zmienna

Zmienna to nazwany pojemnik na wartość. Nadajesz mu nazwę, wkładasz do niego dane (np. liczbę albo tekst), a potem odwołujesz się do tych danych przez nazwę – zamiast wpisywać wartość za każdym razem.

Zmienna w akcji
fun main() {
    val imie = "Anna"      // pojemnik o nazwie imie, w środku tekst "Anna"
    println(imie)            // wypisze: Anna
    println("Cześć, " + imie)   // wypisze: Cześć, Anna
}

W Kotlinie zmienną deklarujemy jednym z dwóch słów kluczowych: val albo var. Wybór między nimi to jedna z najważniejszych decyzji, jaką podejmujesz przy każdej zmiennej.

2

val i var – dwa rodzaje zmiennych

Słowo kluczoweZnaczenieWartość można zmienić?
valWartość przypisywana tylko raz (od ang. value).❌ Nie
varZmienna, którą można nadpisywać (od ang. variable).✅ Tak
val – ustawiamy raz
fun main() {
    val stolica = "Warszawa"
    println(stolica)   // Warszawa
    // stolica zostaje "Warszawa" do końca programu
}
var – możemy nadpisywać
fun main() {
    var wynik = 0
    println(wynik)   // 0

    wynik = 10          // nadpisujemy nową wartością (bez val/var!)
    println(wynik)   // 10

    wynik = wynik + 5    // zwiększamy o 5
    println(wynik)   // 15
}
Nadpisanie to nie deklaracja

Słowa val / var piszemy tylko przy deklaracji – czyli gdy zmienna powstaje. Przy późniejszej zmianie wartości używamy samej nazwy: wynik = 10, bez var.

3

val nie da się zmienić

Próba nadpisania zmiennej val kończy się błędem już podczas pisania kodu – program nawet się nie uruchomi. To celowe zabezpieczenie: skoro coś ma być stałe, język tego pilnuje.

❌ Próba zmiany val

val pi = 3.14
pi = 3.15
// Błąd! val można
// przypisać tylko raz

✅ Potrzebujesz zmian? Użyj var

var licznik = 0
licznik = 1
licznik = 2
// var można nadpisywać
// dowolnie wiele razy
To zaleta, nie ograniczenie

Kiedy widzisz val, masz pewność, że wartość się nie zmieni w trakcie działania programu. To ułatwia czytanie kodu i zapobiega przypadkowym pomyłkom – dlatego val jest w Kotlinie wyborem domyślnym.

4

Inferencja typów – Kotlin sam rozpoznaje typ

Każda zmienna ma swój typ – czyli rodzaj danych, jakie przechowuje (liczba całkowita, tekst, liczba z przecinkiem itd.). W Kotlinie najczęściej nie musisz typu podawać – język sam go odgaduje na podstawie wartości. To nazywa się inferencja typów.

Typ rozpoznany automatycznie
val imie = "Anna"       // Kotlin widzi tekst  -> typ String
val wiek = 18           // liczba całkowita   -> typ Int
val wzrost = 1.75      // liczba z przecinkiem -> typ Double
val pelnoletni = true  // prawda/fałsz       -> typ Boolean

Mimo że nigdzie nie napisaliśmy słowa Int czy String, każda zmienna ma już ustalony typ i nie da się go później zmienić. Typy poznasz dokładniej w następnej lekcji – tu wystarczy wiedzieć, że Kotlin sam je przypisuje.

5

Jawne podanie typu

Typ możesz też podać samodzielnie – piszemy go po nazwie zmiennej, po dwukropku:

Składnia z jawnym typem
val wiek: Int = 18
var licznik: Int = 0
val imie: String = "Anna"

Najczęściej typ pomijamy (inferencja wystarcza), ale czasem warto go podać:

Kiedy podać typ jawnieDlaczego
Brak wartości początkowejSkoro nie ma wartości, Kotlin nie ma z czego odgadnąć typu – musisz go wskazać.
Dla czytelnościGdy z samej wartości nie wynika jasno, co przechowujesz, jawny typ działa jak dokumentacja.
Konkretny typ liczbowyGdy chcesz typ inny niż domyślny (np. Long zamiast Int).
Deklaracja bez wartości – tu typ jest konieczny
fun main() {
    val wynik: Int    // deklarujemy typ, wartość nadamy później
    wynik = 42          // przypisanie (dla val – tylko raz)
    println(wynik)      // 42
}
Zasada kciuka

Jeśli typ jest oczywisty z wartości – pomiń go i zdaj się na inferencję. Podawaj typ jawnie tylko wtedy, gdy faktycznie coś to wnosi (brak wartości, czytelność, nietypowy typ liczbowy).

6

Nazewnictwo zmiennych

Dobra nazwa mówi, co zmienna przechowuje. W Kotlinie obowiązują zasady:

  • Nazwy piszemy stylem camelCase: pierwsze słowo małą literą, kolejne wielką – np. wiekUcznia, liczbaPunktow.
  • Nazwa zaczyna się od litery, nie może zawierać spacji ani zaczynać się od cyfry.
  • Kotlin rozróżnia wielkość liter: wiek i Wiek to dwie różne nazwy.
  • Wybieraj nazwy opisowe – łatwiej zrozumieć kod po czasie.
✅ Dobre nazwy❌ Słabe nazwy
wiekUczniaw (nic nie mówi)
liczbaPunktowx1 (zagadkowe)
czyAktywnydane (zbyt ogólne)
7

Kiedy val, a kiedy var

Prosta reguła, której warto się trzymać od początku:

Zaczynaj od val, zmień na var dopiero gdy musisz

Domyślnie deklaruj zmienne jako val. Jeśli w trakcie pisania okaże się, że wartość naprawdę musi się zmieniać (np. licznik w pętli, suma, która rośnie) – wtedy zmień val na var. Taki nawyk daje bezpieczniejszy i czytelniejszy kod.

SytuacjaWybór
Stała stawka VAT, nazwa miasta, numer PESELval
Suma, która rośnie w trakcie obliczeńvar
Licznik powtórzeń w pętlivar
Wynik wczytany raz od użytkownikaval
8

Częste błędy

❌ Błąd 1: zmiana wartości val

❌ Nadpisanie val

val stawka = 100
stawka = 200
// Błąd! val tylko raz

✅ Zmienna do zmieniania = var

var stawka = 100
stawka = 200
// OK

❌ Błąd 2: użycie zmiennej przed przypisaniem

❌ Brak wartości w chwili użycia

val wynik: Int
println(wynik)
// Błąd! wynik nie ma
// jeszcze wartości
wynik = 5

✅ Najpierw przypisz, potem użyj

val wynik: Int
wynik = 5
println(wynik)
// OK

❌ Błąd 3: próba zmiany typu

❌ Inny typ niż na starcie

var liczba = 5
liczba = "pięć"
// Błąd! typ ustalony
// na Int przy pierwszej
// wartości

✅ Trzymaj się ustalonego typu

var liczba = 5
liczba = 10
// OK - wciąż liczba (Int)

❌ Błąd 4: literówka i wielkość liter w nazwie

❌ Imie to inna nazwa niż imie

val imie = "Ola"
println(Imie)
// Błąd! nie istnieje
// zmienna "Imie"

✅ Dokładnie ta sama nazwa

val imie = "Ola"
println(imie)
// OK
9

Podsumowanie

  • val – wartość przypisywana raz (nie da się zmienić).
  • var – zmienna, którą można nadpisywać dowolnie wiele razy.
  • Słowo val/var piszemy tylko przy deklaracji; przy zmianie wartości używamy samej nazwy.
  • Inferencja typów: Kotlin sam rozpoznaje typ z wartości – zwykle nie musisz go podawać.
  • Typ podajemy jawnie po dwukropku (val wiek: Int = 18) m.in. gdy brak wartości początkowej.
  • Nazwy piszemy stylem camelCase, opisowo; Kotlin rozróżnia wielkość liter.
  • Dobra praktyka: zaczynaj od val, zmień na var tylko gdy wartość musi się zmieniać.
10

Zadania do wykonania

Zadania wykonaj w Kotlin Playground (play.kotlinlang.org).

Zadanie 1 łatwe

Zadeklaruj zmienną val z Twoim imieniem oraz zmienną var z Twoim wiekiem. Wypisz obie w osobnych liniach za pomocą println.

Zadanie 2 łatwe

Zadeklaruj var punkty = 0. Wypisz wartość, następnie zmień ją na 50, wypisz ponownie, na koniec zwiększ o 25 (punkty = punkty + 25) i wypisz wynik.

Zadanie 3 łatwe

Zadeklaruj cztery zmienne z jawnie podanym typem: jedną typu Int, jedną Double, jedną String i jedną Boolean. Wypisz każdą z nich.

Zadanie 4 średnie

Napisz program „dane gracza”: użyj val dla rzeczy stałych (np. nick, rok urodzenia) oraz var dla liczby punktów, która się zmienia. Wypisz dane początkowe, zmień liczbę punktów co najmniej dwa razy i za każdym razem wypisz aktualny stan. W komentarzu uzasadnij, dlaczego dla każdej zmiennej wybrałeś val albo var.