Java che genera un costruttore senza parametri quando non ne hai è come un gentile cameriere che ti prende il cappotto. 
 Java continua a generare un costruttore senza parametri dopo aver definito un'altra versione di esso è come lo stesso cameriere che ti toglie il cappotto dopo aver dato una chiara indicazione che hai i tuoi piani su cosa fare con il cappotto. 
 Se ho una classe (che voglio essere immutabile): 
class Person
{
    final String firstName;
    final String lastName;
 E aggiungo un costruttore: 
    Person(String firstName, String lastName) 
    {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}
 E Java doveva ancora fornire un costruttore predefinito, senza parametri, quindi questo codice non può essere compilato, perché i campi   firstName    e   lastName    sono dichiarati come finali, ma non vengono impostati dopo aver chiamato   Person p = new Person()   . 
 Mi stai costringendo a fornire un'altra implementazione: 
private Person() 
{
    this.firstName = null; // or "", or whatever
    this.lastName = null;
}
 E dal momento che non lo voglio - poiché è inutile, potrei sentirmi incline a mettere teschi e ossa incrociate su di esso: 
@Deprecated
private Person() 
{
    // don't use this constructor! i don't want it to ever be called!
    throw new RuntimeException("Illegal constructor called");
}
 Ma non posso ancora vietare a un altro sviluppatore di creare un metodo (all'interno della classe   Person   , quindi contrassegnare il costruttore come privato non ha aiutato): 
public static Person createPerson()
{
    return new Person(); // this will blow in our face
}
 Tutta questa confusione potrebbe essere - ed è - evitata grazie al fatto che Java (e non solo Java) funziona nel modo in cui funziona. 
 Se definisci un metodo   setCoordinates(int x, int y)   , non ti aspetti che il compilatore accetti automaticamente una versione senza parametri di esso -   setCoordinates()   . Non farebbe nulla. 
 In che modo è diverso dall'aspettarsi un costruttore senza parametri? Beh, ovviamente, un costruttore fa sempre almeno una cosa: crea un oggetto (o muore cercando). 
 Ma mi piace essere  in controllo  di come voglio che i miei oggetti siano istanziati. Costringermi ad avere un costruttore senza parametri, qualunque cosa faccia, toglie questo controllo da me.