The problem is that the keyword void has slipped in, as a result of which we don't have a constructor at all, but a method which happens to have the same name as the class! This is legal, although obviously not a good idea. The call to new Oops() therefore calls the default constructor again and we know the rest.

If void is omitted, this version works:

public  Oops() {
this.theWidget = new Widget(42);
}
...
Oops myInstance = new Oops();
...