Allora, vediamo...
Un oggetto ha (normalmente) una serie di attributi, ovverosia una serie di "sue" variabili il cui insieme di valori in un preciso istante definisce il cosiddetto "stato" dell'oggetto.
Quando istanzi (cioè crei) un nuovo oggetto Java assegna a queste variabili un valore iniziale di default, ad esempio 0 per gli int, null per le stringhe e ogni altro tipo di oggetto, ecc.
E' tuttavia una buona pratica di programmazione inizializzare esplicitamente queste variabili il prima possibile, e proprio per questo arrivano in aiuto i costruttori: il loro scopo principale è permettere allo sviluppatore di assegnare un valore iniziale agli attributi dell'oggetto.
Contestualizzo facendo riferimento al tuo codice.
Nella tua classe "persone" (che per convenzione consolidata sarebbe meglio chiamare "Persone", con la P maiuscola) hai due attributi:
annodinascita, di tipo int
Cognome, di tipo String
Se non esistessero i costruttori, Java inizializzerebbe le due variabili rispettivamente a 0 e null e tu saresti costretto successivamente a dover (ricordarti di) chiamare un metodo specifico per effettuare il primo assegnamento.
Tramite i costruttori, invece, questa operazione viene eseguita automaticamente nel momento in cui esegui l'istruzione "new" e crei un nuovo oggetto: diciamo che, in parole povere, se esegui
codice:
new persone(1950, "Rossi")
quello che stai facendo è, insieme, creare un nuovo oggetto e richiamare su di esso il "metodo costruttore" (che devi definirti tu, proprio come hai fatto) che riceve in ingresso un int e una String.
A questo punto, all'interno delle due variabili "annonascita" e "Cognome" che hai definito nella dichiarazione
codice:
public persone(int annonascita, String Cognome)
ci sono i due valori 1950 e "Rossi". Tuttavia questi valori non sono ancora stati memorizzati nei due attributi che vuoi inizializzare, ma si trovano in due variabili locali! Lo devi fare esplicitamente, ed è quello che succede nelle righe successive:
codice:
annodinascita = annonascita;
this.Cognome = Cognome;
Non farti confondere dalla seconda istruzione: this.Cognome e Cognome sono due variabili DIVERSE: la prima è l'attributo dell'oggetto, la seconda la variabile locale. Nonostante il nome sia lo stesso, Java "sa" che sei in un costruttore e capisce quello che vuoi fare, risolvendosi da solo il problema dell'apparente ambiguità.
Così com'è, funziona senza problemi. Tuttavia, se avessi dovuto scrivere io il codice avrei fatto
codice:
public persone(int default_annodinascita, String default_cognome)
{
this.annodinascita = default_annodinascita;
this.cognome = default_cognome;
}
Preferisco una struttura del genere, ma solo per motivi di leggibilità (nota anche che ho chiamato "cognome" con la c minuscola, sempre per convenzione gli oggetti usano l'iniziale minuscola).
In ultimo, gli altri due costruttori: semplicemente le due istruzioni
codice:
this(annonascita, "Non Conosco");
this(0, Cognome);
effettuano una chiamata "interna" al costruttore (int, String) già discusso prima: una sorta di catena diciamo. In questo modo, hai la possibilità, se vuoi, di creare un oggetto con le istruzioni
codice:
new persone(1950);
new persone("Rossi");
Nel primo caso gli attributi conterranno rispettivamente 1950 e "Con Conosco"; nel secondo, 0 e "Rossi".
Spero di averti chiarito un po' di più le cose. Perdonami, ma a volte divento prolisso