fun StarWarsMovie.releaseYear(): Int {
    val year = release_date.substring(0, 4)
    return year.toInt()
}
val newHope = StarWarsMovie("A New Hope", 4, "1977-05-25")
val releaseYear = newHope.releaseYear()
println("The release year of A New Hope is $releaseYear")

No exemplo acima, definimos um novo método na classe, chamado releaseYear(). Observe que o definimos diretamente na classe existente: StarWarsMovie.releaseYear(). Podemos fazer isso com nossas próprias classes, mas também com classes importadas de bibliotecas de terceiros. A documentação do Kotlin mostra um exemplo de adição de um método à biblioteca padrão. (Estou um pouco cauteloso com esse tipo de patch de macaco, mas certamente mostra a flexibilidade do Kotlin.)

Agora, imagine que queríamos StarWarsMovie ser uma subclasse de uma Movie superclasse. Em Kotlin, poderíamos fazer algo assim:


open class Movie(val title: String, val releaseDate: String) { 
  open fun releaseYear(): Int { 
    val year = releaseDate.substring(0, 4) return year.toInt() 
  } 
} 

class StarWarsMovie(title: String, episodeId: Int, releaseDate: String) : Movie(title, releaseDate) { 
  val episodeId: Int = episodeId 
}

O open palavra-chave indica que uma classe ou função está disponível para subclassificação ou substituição. Em termos Java, as classes Kotlin são finais por padrão. Membros públicos padrão e classes finais padrão poderiam ser interpretados como um incentivo sutil para preferir a composição à herança. No exemplo anterior, usamos declaração baseada em construtor para ambos StarWarsMovie e Movie. O cólon em : movie indica extensão, funcionando de forma semelhante ao Java extends palavra-chave.