Why default constructor is required in a parent class if it has an argument-ed constructor?
Why default constructor is required(explicitly) in a parent class if it has an argumented constructor
class A {
A(int i){
}
}
class B extends A {
}
class Main {
public static void main(String a[]){
B b_obj = new B();
}
}
This will be an error.
Solution 1:
There are two aspects at work here:
If you do specify a constructor explicitly (as in
A
) the Java compiler will not create a parameterless constructor for you.-
If you don't specify a constructor explicitly (as in
B
) the Java compiler will create a parameterless constructor for you like this:B() { super(); }
(The accessibility depends on the accessibility of the class itself.)
That's trying to call the superclass parameterless constructor - so it has to exist. You have three options:
- Provide a parameterless constructor explicitly in
A
- Provide a parameterless constructor explicitly in
B
which explicitly calls the base class constructor with an appropriateint
argument. - Provide a parameterized constructor in
B
which calls the base class constructor
Solution 2:
Why default constructor is required(explicitly) in a parent class if it has an argumented constructor
I would say this statement is not always correct. As ideally its not required.
The Rule is : If you are explicitly providing an argument-ed constructer, then the default constructor (non-argumented) is not available to the class.
For Example :
class A {
A(int i){
}
}
class B extends A {
}
So when you write
B obj_b = new B();
It actually calls the implicit constructor provided by java to B, which again calls the super(), which should be ideally A(). But since you have provided argument-ed constructor to A, the default constructor i:e A() is not available to B().
That's the reason you need A() to be specifically declared for B() to call super().