Inner and nested classes help organize code by grouping related classes together inside another class.
Inner classes and nested classes in Kotlin
class Outer { class Nested { // Nested class code } inner class Inner { // Inner class code } }
A nested class does not have access to the outer class's members.
An inner class can access the outer class's members and needs the inner keyword.
class Outer { class Nested { fun greet() = "Hello from Nested" } }
name property.class Outer(val name: String) { inner class Inner { fun greet() = "Hello from Inner, outer name is $name" } }
This program shows how to create and use nested and inner classes. The nested class cannot access the outer class's name, but the inner class can.
class Outer(val name: String) { class Nested { fun greet() = "Hello from Nested" } inner class Inner { fun greet() = "Hello from Inner, outer name is $name" } } fun main() { val nested = Outer.Nested() println(nested.greet()) val outer = Outer("Kotlin") val inner = outer.Inner() println(inner.greet()) }
Use inner keyword only when the inner class needs to access outer class members.
Nested classes are like static classes in other languages; they don't hold a reference to the outer class.
Inner classes hold a reference to the outer class instance, so be careful to avoid memory leaks.
Nested classes are defined inside another class but cannot access its members.
Inner classes use the inner keyword and can access outer class members.
Use inner classes when you need to work closely with the outer class's data.
Practice
Solution
Step 1: Understand nested class behavior
Nested classes are static by default and cannot access outer class members directly.Step 2: Understand inner class behavior
Inner classes use theinnerkeyword and can access outer class members.Final Answer:
An inner class can access members of the outer class, but a nested class cannot. -> Option AQuick Check:
Inner class = access outer members [OK]
- Thinking nested classes can access outer members
- Confusing inner classes as static
- Assuming both classes behave the same
Solution
Step 1: Recall inner class syntax
In Kotlin, inner classes require theinnerkeyword to access outer class members.Step 2: Check options for correct keyword
class Outer { inner class Inner { } } usesinner class Inner, which is the correct syntax.Final Answer:
class Outer { inner class Inner { } } -> Option CQuick Check:
Use 'inner' keyword for inner classes [OK]
- Omitting 'inner' keyword for inner classes
- Using 'static' keyword which is invalid in Kotlin
- Confusing 'open' with 'inner'
class Outer(val name: String) {
inner class Inner {
fun greet() = "Hello, $name"
}
}
fun main() {
val outer = Outer("Kotlin")
val inner = outer.Inner()
println(inner.greet())
}Solution
Step 1: Understand inner class access
The inner class can access the outer class propertynamebecause it is declared withinner.Step 2: Trace the code execution
Creatingouterwith name "Kotlin" and theninnerinstance callsgreet()which returns "Hello, Kotlin".Final Answer:
Hello, Kotlin -> Option BQuick Check:
Inner class accesses outer property correctly [OK]
- Assuming inner class cannot access outer properties
- Expecting null or empty output
- Thinking code causes compilation error
class Outer {
class Nested {
fun printMessage() = println("Hello from Nested")
}
}
fun main() {
val nested = Outer.Nested()
nested.printMessage()
println(nested.printMessage())
}Solution
Step 1: Check nested class instantiation
Nested classes are static by default and can be instantiated without an Outer instance, so no error here.Step 2: Analyze println usage
The functionprintMessage()prints a message and returnsUnit. Callingprintln(nested.printMessage())prints the message and then printskotlin.Unit, which is allowed.Step 3: Confirm no errors
There is no compilation or runtime error; the code runs and produces output as written.Final Answer:
No errors; code runs and prints correctly. -> Option DQuick Check:
Nested class instantiation and Unit printing both OK [OK]
- Thinking nested class needs Outer instance
- Expecting compilation error on nested class
- Ignoring Unit return type printing
class Outer(val x: Int) {
inner class Inner {
fun multiply(y: Int) = x * y
}
class Nested {
fun multiply(y: Int) = y * 2
}
}
fun main() {
val outer = Outer(5)
val inner = outer.Inner()
val nested = Outer.Nested()
println(inner.multiply(3))
println(nested.multiply(3))
}Solution
Step 1: Calculate inner class multiply
Inner class accesses outer propertyx=5, somultiply(3)returns 5*3=15.Step 2: Calculate nested class multiply
Nested class method multiplies input by 2, somultiply(3)returns 6.Step 3: Confirm output lines
Printing inner.multiply(3) prints 15, printing nested.multiply(3) prints 6 on next line.Final Answer:
15 6 -> Option AQuick Check:
Inner uses outer x, nested doubles input [OK]
- Assuming nested class can access outer x
- Mixing up multiply results
- Expecting compilation error
Ready to prove it?
Pass the test and this pattern moves unknown
