Abstract class represents a more top level of objects, in some cases these top level objects need values to be set at the creation of the object by the business perspective. Missing to set this value could cause business object to fail. The constructors are supported in the abstract class to enforce setting a value when building the class (otherwise it could be forgotten). For example,
public abstract class AccountHolder
{
}
public abstract class Account
{
private AccountHolder holder;
public Account(AccountHolder holder)
{
this.holder = holder;
}
}
public class FixedDeposit extends Account
{
public FixedDeposit (AccountHolder holder)
{
super(holder)
}
}
Here we cannot imagine a account without a holder, so it's essential to the business to set the holder when creating the object. Setting it in the base level ensures it will be forced to set when adding new types of sub classes. Hence it's to ensure 'Open for extensions but closed for modification' one of the SOLID principles.