What kinds of constructor does Java support, and what does the compiler do when you do not declare one?
Java constructors fall into a handful of recognisable shapes. A no-argument constructor takes no parameters and initialises the object with defaults or with values you hard-code. A parameterised constructor takes arguments and uses them to set the initial state. A copy constructor takes a single argument of the same class type and copies an existing object. A private constructor blocks outside callers from creating instances, which is how utility classes and singletons enforce their rule. A static factory method is not a constructor at all, but it is the idiomatic alternative when construction needs to be validated or the type needs more than one representation.
When you declare no constructor, the compiler generates a default one for you. It has the same access as the class, it takes no arguments, and it calls the superclass no-argument constructor. Every field is left at its default value — zero, false, null — because the constructor body does nothing.
The rule that catches people out is that declaring any constructor suppresses the implicit default one. Once you write a parameterised constructor, new MyClass() no longer compiles. That is why you sometimes see an explicit no-argument constructor written alongside a parameterised one: it is not redundant, it is preserving the ability to construct the object without arguments, often because a framework needs it.
Two more constraints. The constructor name must match the class name exactly, and unlike a method it has no return type — not even void. And a constructor must be the first statement to call this or super when it needs to delegate, which is what makes constructor chaining possible.