The code below
Shape ball = new Shape(); // takes no parameter
instantiates a new object with a default state. This no-argument constructor is also known as the default constructor since it initializes the object to its defaults.
When invoking a parametrized constructor
Shape ball = new Shape(1,2); // takes parameters
you're instantiating a new object as well as giving it a custom initial state; one that differs from what the above no-argument constructor would have initialized the object with.
Having multiple constructors taking different parameters is known as constructor overloading. Deciding which constructor to use comes down to your requirements. For example, if you had the following two constructors for a class, say, Circle
public Circle() {
this.center = new Point(0, 0);
this.radius = 1;
}
public Circle(int x, int y, int r) {
this.center = new Point(x, y);
this.radius = r;
}
You would use the parametrized constructor any time you want a circle with its centre different than (0,0) or having a different radius.