Skip to content

Nested class vs Inner class

Devrath edited this page Dec 26, 2023 · 3 revisions

In Kotlin, nested classes and inner classes are two different concepts, and they are used to achieve different goals.

class OuterClass {

    val outerClassMember = "outerClassMember"
    fun outerClassFunction() { }

    class NestedClass {
        val nestedClassMember = "nestedClassMember"
        fun nestedClassFunction() { 
            // This is not possible
            // val nestedClassVariable = outerClassMember 
            // This is not possible
            // outerClassFunction()
        }
    }

    inner class InnerClass {
        val innerClassMember = "innerClassMember"
        fun innerClassFunction() {
            // This is possible
            val nestedClassVariable = outerClassMember
            // This is possible
            outerClassFunction()
        }
    }

}

Nested Class:

A nested class in Kotlin is simply a class that is declared inside another class. It doesn't have access to the members of the outer class by default, and you can instantiate it without an instance of the outer class.

class OuterClass {
    // Outer class members

    class NestedClass {
        // Nested class members
    }
}

// Instantiating the nested class
val nestedInstance = OuterClass.NestedClass()

Inner Class:

An inner class, on the other hand, is a class that is marked with the inner keyword. It is a member of the outer class and can access the members of the outer class.

class OuterClass {
    // Outer class members

    inner class InnerClass {
        // Inner class members can access the outer class members
    }
}

// Instantiating the inner class
val innerInstance = OuterClass().InnerClass()

With an inner class, you can access the members of the outer class using this@OuterClass syntax.

class OuterClass {
    private val outerProperty: String = "Outer Property"

    inner class InnerClass {
        fun accessOuterProperty() {
            println(this@OuterClass.outerProperty)
        }
    }
}

// Instantiating and using the inner class
val innerInstance = OuterClass().InnerClass()
innerInstance.accessOuterProperty()

In summary:

  • Nested class: Doesn't have access to the outer class by default.
  • Inner class: Has access to the members of the outer class and is marked with the inner keyword.

Choose between nested and inner classes based on whether you need access to the outer class members within the inner class.

Clone this wiki locally