Java: the “super” Keyword
super
is a instance of the parent class.super()
calls the default constructor of the parent class.super(…)
calls the user-defined constructor with matching arg of parent class.super.methodName(…)
calls a method of parent class.
When creating a constructor of a class whose parent class has a user-defined constructor, then in the definition of the constructor it must call the parent class's constructor, in the first line, using the super
keyword.
Following is a guide on why we need it.
Here's a example of inheritance of a class that has a constructor.
Note: constructors are never inherited, only variables and methods are. [see Java: Constructor]
// example of extending a class that has constructor class B { B () { System.out.println("B called"); } int ff (int n) { return n + 1; } } class C extends B {} public class T { public static void main(String[] args) { C c = new C(); System.out.println(c.ff(4)); // 5 } }
In the above code, C is subclass of B. So, C inherent B's
methods. However, the special method B()
is B's constructor, and it
is not inherited because Java does not inherit constructors.
In the “main” method, a instance of C is created, and the inherited method ff
is called.
If you run the program, it will print “B called” followed by “5”.
In Java, when a subclass is created, it automatically calls its parent's constructor (if the class itself does not define constructors).
Extending a Class that has Constructor with Parameters
Here's a example of extending a class that has a constructor with parameters.
The code won't compile and gives a mysterious message. See if you can fix it.
/* note: this code won't compile*/ class B { B (int n) { System.out.println("B's constructor called"); } } class C extends B { C (int n) { System.out.println("C's constructor called"); } } public class I2 { public static void main(String[] args) { B b = new B(4); C c = new C(2); } }
here's the error message. (from javac 1.8)
I2.java:10: error: constructor B in class B cannot be applied to given types; C (int n) { ^ required: int found: no arguments reason: actual and formal argument lists differ in length 1 error
The super
is a instance of the parent class.
In our example, the class B has a user defined constructor. Therefore, Java did not create a do-nothing constructor for it. And, thus when we have a class C that extends B, you need to call the constructor of B.
To fix the code above, add super(n);
in the first line of the subclass's constructor.
If the class C does not call B's constructor, Java compiler automatically assumes that the user wants the no-argument constructor B()
, and call it for you. But since Java did not internally create the no-argument constructor, therefore it gives the error of symbol not found.
Here's the fixed code.
class B { B (int n) { System.out.println("B's constructor called"); } } class C extends B { C (int n) { super(n); System.out.println("C's constructor called"); } } public class I2 { public static void main(String[] args) { B b = new B(4); C c = new C(2); } }