Fermati un secondo al costruttore di default (quello senza parametri).
Nel caso in esame, prima di procedere col mio costruttore comunque chiamo il costruttore di default nella classe padre.
Quindi se la classe estende JFrame, prima chiamo il costruttore di default di JFrame e poi proseguo con il mio costruttore.
Posso anche decidere quale costruttore chiamare (facendo quindi una chiamata esplicita), ma il costruttore della classe padre viene comunque chiamato prima di procedere con la classe figlia.
se tu hai una chiamata a this(), prima passi all'altro costruttore e da quello prima risali la gerarchia e poi continui con il tuo.
Se tu non avessi aggiunto un costruttore, il compilatore ne avrebbe aggiunto uno di default, che alla fine avrebbe chiamato solo i costruttori della gerarchia al tuo posto.
Il fatto che tu ne aggiunga uno (o più di uno) significa che vai ad indicare COME creare l'oggetto, ma la chiamata al costruttore di default c'è sempre, a meno che tu esplicitamente non vai ad indicare quale costruttore vuoi chiamare.
Non riesco a spiegarmi meglio. La vera confusione c'è in C++ perché hai ereditarietà multipla, quindi capire l'ordine di chiamata spesso non è facile.
In questo caso particolare, chiama il costruttore di default, successivamente ha qualcosa di non inizializzato che dà la NPE. Bisognerebbe capire chi/cosa causa la NPE.