Kotlin programlama dilinde classları iç içe tanımlayabilriiz.

class disclass
{
    var hangiclass = "Dış Class"
    
    fun disClassSelam()
    {
        println("Dış Class Çalıştırıldı..")
    }
    
    class icClass
    {
        var hangiclass = "İç Class"
        
        fun icClassSelam()
        {
            println("İç Class Çalıştırıldı")
        }    
        
        /* Burada icClass, disClass'ın elemanlarına erişemeyecektir. */
        
    }
}

Yukarıdaki örnekte bir nested (iç içe) class tanımladık. Ancak, dikkat edilirse icClass, disClass’ın elemanlarına erişemiyor. Bunun için, tanımladığımız icClass’ı inner class olarak tanımlarsak disClass’taki elemanlara da erişebiliriz. 

class disclass
{
    var hangiclass = "Dış Class"
    
    fun disClassSelam()
    {
        println("Dış Class Çalıştırıldı..")
    }
    
    inner class icClass
    {
         var hangiclass = "İç Class"
        
        fun icClassSelam()
        {
            disClassSelam() /* Dış Classtaki metoda erişebildik.. */
            
            println("İç Class Çalıştırıldı")
        }    
        
    }
}

Şuanda mutlaka aklınıza takılmıştır. Nested ve inner claslardan nasıl nesne üretebiliriz?

class disclass
{
    var hangiclass = "Dış Class"
    
    fun disClassSelam()
    {
        println("Dış Class Çalıştırıldı..")
    }
    
    class icClass
    {
         var hangiclass = "İç Class"
        
        fun icClassSelam()
        {
                    
            println("İç Class Çalıştırıldı")
        }    
        
    }
}

fun main(args: Array<String>)
{
    var icC : disclass.icClass = disclass.icClass()
    icC.icClassSelam()
}

inner olmayan nested classlardan nesne üretmek istiyorsak yukarıdaki gibi gerçekleştiririz.

class disclass
{
    var hangiclass = "Dış Class"
    
    fun disClassSelam()
    {
        println("Dış Class Çalıştırıldı..")
    }
    
    inner class icClass
    {
         var hangiclass = "İç Class"
        
        fun icClassSelam()
        {
                    
            println("İç Class Çalıştırıldı")
        }    
        
    }
}

fun main(args: Array<String>)
{
    var disC : disclass = disclass()
    disC.icClass().icClassSelam()
}

Eğer class, bir inner class ise nesne üretme işlemi yukarıdaki gibi gerçekleştirilecektir. Şimdi gelelim Anonymous Inner Class kavramına. Interface konumuzda, interfacelerden nesne üretemediğimizi belirtmiştim normal bir şekilde interfacelerden nesne üretilemez, ancak bunu gerçekleştirmek için Anonymous (isimsiz) sınıflardan yararlanırız. 

interface listener
{
    fun read()

}

class scanner : listener
{
    override fun read()
    {
        println("Scanner is working by listener..")
    }
}

fun main(args: Array<String>)
{
    var scn : scanner = scanner()
    scn.read()
    
    /* object anahtar sözcüğü ile interface'den miras aldık ve yeni bir sınıf oluşturduk */
    
    var anonymousClass = object:listener
    {
        override fun read()
        {
            println("Anonymous class is created and read by listener..")
        }
    }
    
    anonymousClass.read()
}

Object anahtar kelimesi yardımıyla burada yeni bir sınıf oluşturduk ve listener interface rahatlıkla kullanabiliyoruz.