Variables (val & var)
Kotlin is a modern, concise language that gives you two ways to name data: val for read-only values and var for ones you can change.
Learn Variables (val & var) in our free Kotlin course — a beginner-friendly interactive lesson with worked examples, a practice exercise and a quick reference.
Part of the free Kotlin course at LearnCodingFast — hands-on lessons with examples you run in your browser, plus practice exercises and a quick quiz.
By the end of this lesson you'll know exactly when to reach for each, how type inference saves you keystrokes, and how Kotlin's basic types — Int, Double, Boolean, Char, and String — work.
What You'll Learn in This Lesson
1️⃣ val vs var
Kotlin has exactly two keywords for declaring variables. val creates a read-only reference that can be assigned once. var creates a mutable reference you can reassign as many times as you like. The rule of thumb: prefer val , and switch to var only when you must.
The last two lines are the subtle part: val items can't point at a different list, but the list itself is mutable, so add still works. val freezes the reference , not the contents.
2️⃣ Types and Type Inference
Kotlin is statically typed — every variable has a type — but you rarely have to write it. The compiler infers the type from the value. When you do want to be explicit, add a colon and the type after the name. Kotlin's basic types include Int , Long , Double , Boolean , Char , and String .
Notice Kotlin won't silently widen numbers: to treat an Int as a Double you call .toDouble() . This prevents accidental precision loss.
Your turn. Fill in the TODO s, following the 👉 hints, then run and compare.
Mini-Challenge: A Shopping Total
Use what you've learned about val , var , and types to build a small total. Write it yourself and check it against the example output.
Common Errors (and the fix)
- "Val cannot be reassigned" — You tried to give a new value to a val . If it needs to change, declare it as var instead.
- "Type mismatch: Int vs Double" — You mixed number types without converting. Call .toDouble() (or the type you need) to convert explicitly.
- "Variable must be initialized" — A val or var needs a value or an explicit type. Either assign a value, or write the type so the compiler knows what it is.
- Using single quotes for text — 'hi' is a Char error; only one character fits in single quotes. Use "hi" with double quotes for a String.
Pro Tips
- 💡 Underscores in numbers: write 1_000_000 instead of 1000000 — the underscores are ignored but make big numbers readable.
- 💡 Compound assignment: score += 1 is shorthand for score = score + 1 (also -= , *= , /= ).
- 💡 Lint nudges: IntelliJ will suggest changing a var to a val if it's never reassigned. Take the hint.
📋 Quick Reference — Variables
Concept
Kotlin Syntax
Read-only variable
val x = 5
Mutable variable
var y = 5
Explicit type
val n: Long = 5
Convert a number
n.toDouble()
Compound assign
y += 1
Readable big number
1_000_000
Frequently Asked Questions
🎉 Lesson Complete!
- ✅ val is read-only; var can be reassigned
- ✅ Idiomatic Kotlin prefers val
- ✅ Type inference means you rarely write the type
- ✅ Basic types: Int, Long, Double, Boolean, Char, String
- ✅ Number conversions are explicit: .toDouble()
- ✅ Next lesson: Null Safety — Kotlin's most famous feature
Practice quiz
What does val declare in Kotlin?
- A read-only reference you cannot reassign
- A mutable variable
- A function
- A constant only known at runtime
Answer: A read-only reference you cannot reassign. val creates a read-only reference assigned once.
Which keyword lets you reassign a variable later?
- val
- var
- const
- let
Answer: var. var creates a mutable reference you can reassign.
What happens if you try to reassign a val?
- It silently works
- It compiles with a warning
- A compile error: Val cannot be reassigned
- It becomes a var
Answer: A compile error: Val cannot be reassigned. Reassigning a val is a compile-time error.
What does Kotlin's type inference let you do?
- Skip declaring variables
- Convert types automatically
- Run without a compiler
- Omit the type when it is clear from the value
Answer: Omit the type when it is clear from the value. val x = 5 infers Int, so you rarely write the type explicitly.
Does val make the object it points to immutable?
- No, it only stops reassigning the reference; a mutable object can still change
- Yes, everything becomes frozen
- Only for numbers
- Only inside functions
Answer: No, it only stops reassigning the reference; a mutable object can still change. val freezes the reference, not the contents; a mutable list can still be modified.
Which literal correctly declares a Char?
- "N"
- 'N'
- Char(N)
Answer: 'N'. A Char uses single quotes, like 'N'; double quotes make a String.
How do you turn an Int into a Double in Kotlin?
- It happens automatically
- Cast with (Double)
- Call .toDouble() explicitly
- Add 0.0 silently
Answer: Call .toDouble() explicitly. Kotlin avoids implicit widening; call .toDouble() explicitly.
What is the value and type of val x = 5?
- A String "5"
- A Double 5.0
- A function returning 5
- An Int with value 5
Answer: An Int with value 5. An integer literal is inferred as Int.
What is idiomatic Kotlin's default choice between val and var?
- Prefer val, use var only when reassignment is needed
- Always use var
- Always use const
- It does not matter
Answer: Prefer val, use var only when reassignment is needed. Default to val to signal that the value will not change.
What do underscores do in a number like 1_000_000?
- Cause a compile error
- Are ignored but make big numbers readable
- Multiply the value
- Convert it to a String
Answer: Are ignored but make big numbers readable. Underscores are visual separators the compiler ignores.
Continue this course
- Previous: Introduction to Kotlin
- Next: Null Safety