Partiamo direttamente da alcuni esempi:
class StringMethod(val id: String) {
}
fun main() {
val sm = StringMethod("first")
println(sm)
}
//produce : Class.StringMethod@7cca494b
il motivo è legato al fatto che solo le stringhe possono essere stampate con il metodo println, tutto il resto deve essere trattato con il Tostring e vale anche per le classi Class.StringMethod@7cca494b è l’output standard composto da class. nome classe @ allocazione di memoria. Per cui se vogliamo eseguire un comando tipo:
val sm = StringMethod(“first”)
println(sm)
dobbiamo necessariamente usare il metodo ToString ad esempio:
class StringMethodOverride(val id: String) {
override fun toString(): String {
return "id: $id + super " + super.toString()
}
}
fun main() {
val sm = StringMethodOverride("first")
println(sm)
}
// che restitutisce:
// id: first + super Class.StringMethodOverride@7cca494b
Allora proviamo a spiegare, facciamo l’override del metodo Tostrig (ovviamente non c’è la relativa superclasse perché tutte le classi in Kotlin ereditano implicitamente da una superclasse comune chiamata Any
. Ma questo lo spiegheremo dopo parlando della classe Any) in pratica decidiamo cosa deve fare il metodo Tostring indicando cosa deve restitutire la funzione.
Poiché abbiamo fatto l’override del metodo possiamo usare super se vogliamo richiamare il metodo originale (cioè prima di sovrascriverlo) l’output sarà quello di entrambi i metodi
In koltin tutte le classi ereditano da una classe he si Any, in Java si chiama object questo ci ha consentito di fare l’Override del metodo toString senza specificare con i : da quel classe stavamo ereditando il metodo. Infatti se posizioniamo il mouse sulla key word Super Itellij ci mostra chiaramente che sta ereditando il metodo dalla classe Any.

Cliccando poi sulla matita, modifica possiamo aprire proprio la classe e darci un occhiata. In pratica il codice:
class StringMethodOverride(val id: String) {
potrebbe essere sostituito con:
class StringMethodOverride(val id: String) : Any() {
ma non è necessario farlo poiché il compilatore lo fa per noi.
Attenzione nell’ereditarietà si può ereditare un’unica classe, Metre Any viene ereditata sempre. Per i metodi la classe Any
definisce tre metodi fondamentali che sono disponibili per ogni oggetto in Kotlin:
equals(other: Any?): Boolean
hashCode(): Int
toString(): String
Questi metodi sono dichiarati come open
nella classe Any
, il che significa che sono destinati ad essere sovrascritti dalle sottoclassi per fornire un comportamento specifico.
Infine, perché è utile toString()
?
Il metodo toString()
è molto utile per ottenere una rappresentazione stringa significativa di un oggetto. L’implementazione di default in Any
(che vedresti se non sovrascrivi toString()
) tipicamente restituisce qualcosa come NomeDellaClasse@hashCode
, che non è molto informativo. Sovrascriverlo ti permette di stampare i valori delle proprietà dell’oggetto, rendendo il debug e la registrazione molto più semplici.
In sintesi: puoi fare l’override di toString()
perché, anche se non lo dichiari, ogni classe Kotlin ha una superclasse (Any
) che definisce già quel metodo come open
e disponibile per la sovrascrittura.