Il codice che hai riportato ha un problema (e difatti il compilatore se ne accorge e ti segnala un errore): il costruttore che riceve un "int" richiama il costruttore che riceve una "String", e viceversa.
E' una situazione ricorsiva, che se eseguita porterebbe ad un loop (A chiama B, che chiama A, che chiama B, ecc.). Una soluzione migliore è:
codice:
class persone
{
// Proprietà
public int annodinascita;
public String Cognome=new String();
// Costruttori
public persone(int annonascita)
{
this(annonascita, "Non Conosco");
}
public persone(String Cognome)
{
this(0, Cognome);
}
public persone(int annonascita , String Cognome)
{
annodinascita = annonascita;
this.Cognome = Cognome;
}
// Metodo che calcola l'età del soggetto
public int calcolaeta (int annoattuale)
{
return (annoattuale - annodinascita);
}
}
in cui entrambi i costruttori fanno riferimento a quello che riceve entrambi i parametri.
Come dici tu, scopo primario dei costruttori è dare un valore di "default" alle variabili di un oggetto appena creato.
Per risponderti:
1) ai costruttori devi passare il valore della variabile che vuoi utilizzare per l'inizializzazione che, all'interno del codice, sarà utilizzabile tramite l'identificatore che hai dichiarato (nel tuo caso "annonascita" e "Cognome")
2) il codice che ti ho postato dovrebbe risponderti da solo: l'inizializzazione avviene nel costruttore "int, String"