Prima di tutto, si noti che sono un C ++ e Python, non Java, quindi alcuni di questi potrebbero non essere applicabili in modo completo. Per favore correggimi se faccio alcune ipotesi errate su come funzionano le classi in Java.
Le classi sono principalmente utili quando vengono istanziate. Una classe di cui non sono state create istanze è in realtà solo uno spazio dei nomi glorificato. Se utilizzi tutte le tue classi in questo modo, in effetti, i vantaggi di spostare oggetti dallo spazio dei nomi allo spazio dei nomi potrebbero sembrare insignificanti: al massimo, vincerai avendo alcuni dati privati in ognuno e quindi incapsulando un po 'le cose.
Tuttavia, non è qui che le classi brillano. Considera la classe String
: potresti avere tutte le stesse funzioni usando char
matrici e alcune funzioni statiche. A questo punto, le funzioni ti danno un po 'di sicurezza in più e zucchero sintattico. Puoi scrivere string.length()
invece di length(char_array)
; non è un grosso problema, ma a molte persone piace ancora. Inoltre, sai che se qualcuno ti ha dato un String
, è stato creato con il costruttore String
e deve funzionare con la funzione length
- se la versione dell'array non può gestire un personaggio allora non ha modo di impedirti di metterlo lì dentro.
Non è ancora così, però. Il punto chiave è che le classi raggruppano i dati e le funzioni che operano su di essi e ne astraggono entrambi. Quando hai un metodo void f(Builder b)
sai che riceverai un Builder
e puoi aspettarti che supporterà determinati comportamenti. Tuttavia, non si conosce nulla dei dati o delle funzioni in esecuzione: infatti, le definizioni per entrambi potrebbero non essere ancora scritte mentre si scrive e si compila f
.
Il primo punto da capire è quindi che le classi rendono conveniente passare i dati assicurandosi che non sia rotto. Il secondo punto è che sia i dati che le funzioni (implementazioni) di un oggetto sono qualcosa sull'oggetto, non qualcosa che puoi semplicemente dire dal suo tipo.