super keyword is used to access methods of the parent class while this is used to access methods of the current class.
- this is a reserved keyword in java i.e, we can’t use it as an identifier.
- this is used to refer current-class’s instance as well as static members.
this can be used in various contexts as given below:
- to refer instance variable of current class
- to invoke or initiate current class constructor
- can be passed as an argument in the method call
- can be passed as argument in the constructor call
- can be used to return the current class instance
- super is a reserved keyword in java i.e, we can’t use it as an identifier.
- super is used to refer super-class’s instance as well as static members.
- super is also used to invoke super-class’s method or constructor.
Similarities in this and super
1) We can use this as well as super anywhere except static area. Example of this is already shown above where we use this as well as super inside public static void main(Stringargs) hence we get Compile Time Error since cannot use them inside static area.
2) We can use this as well as super any number of times in a program.
100 600 9000
See above we have used this 3 times. So this can be used any number of times.
See above we have used super 2 times. So super can be used any number of times.
Note: We can use ‘this’ as well as ‘super’ any number of times but main thing is that we cannot use them inside static context.
Let us consider a tricky example of this keyword:
//it is of S.O.P(first) of garcia method 22 //it is of S.O.P(second) of garcia method 33 //it is of S.O.P(a) of garcia method 22 //it is of S.O.P(b) of garcia method 33 //it is of S.O.P(first) of louis method 1 //it is of S.O.P(second) of louis method 2 //it is of S.O.P(m) of louis method 1 //it is of S.O.P(n) of louis method 2
Flow of program : First, it start from main and then we have new RR().garcia(100, 200) then flow goes to garcia method of RR class and then in that we have
a = this.first b = this.second
Here, what is happening is that the value of instance variable(i.e, first) and the value of static variable(i.e, second) are assigned to the garcia method’s local variables a and b respectively. Hence value of a and b comes out to be 22 and 33 respectively. Next we have new RR().louis(1, 2) hence here flow goes to the louis method of RR class and in that we have
this.first = m this.second = n
Here, above what happens is that the value of the louis method’s local variables i.e, m and n are assigned to the instance as well as static variables i.e, first and second respectively.
Hence, the value of first and second variables are same which we have passed into the louis method i.e, 1 and 2 respectively.
Can we use both this() and super() in the same constructor?
An interesting thing to note here is that according to Java guidelines, this() or super() must be the first statement in the constructor block for it to be executed. So we cannot have them together in the same constructor as both need to be the first statement in the block for proper execution, which is not possible. Trying to do so would raise a compiler error.
On running the above program, we get an error on line number 12 saying that “call to this must be first statement in constructor”. This is because we tried using both super() and this() together. While super() was the first line of the constructor, this() statement violated the condition that it should be the first line, hence raising an error.
Compile Errors :
prog.java:12: error: call to this must be first statement in constructor this(); ^ 1 error
This article is contributed by Rajat Rawat. If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to email@example.com. See your article appearing on the GeeksforGeeks main page and help other Geeks.
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.
Attention reader! Don’t stop learning now. Get hold of all the important Java Foundation and Collections concepts with the Fundamentals of Java and Java Collections Course at a student-friendly price and become industry ready.