Skip to content
Related Articles
Open in App
Not now

Related Articles

Difference between super() and this() in java

Improve Article
Save Article
  • Difficulty Level : Hard
  • Last Updated : 09 Nov, 2022
Improve Article
Save Article

super and this keyword super() as well as this() keyword both are used to make constructor calls. super() is used to call Base class’s constructor(i.e, Parent’s class) while this() is used to call the current class’s constructor. Let us see both of them in detail:

super() Keyword 

super() is used to call Base class’s(Parent class’s) constructor

Java




// Java code to illustrate usage of super()
  
class Parent {
    Parent()
    {
        System.out.println("Parent class's No " +
                              " arg constructor");
    }
}
  
class Child extends Parent {
    Child()
    {
        super();
        System.out.println("Flow comes back from " +
                        "Parent class no arg const");
    }
    public static void main(String[] args)
    {
        new Child();
        System.out.println("Inside Main");
    }
}

Output:

Parent class's No arg constructor
Flow comes back from Parent class no arg const
Inside Main

Flow of Program:

  • In main, we have made a statement new Child(), so it calls the no argument constructor of Child class.
  • Inside that we have super() which calls the no argument of Parent class since we have written super() and no arguments that’s why it calls no argument constructor of Parent class, in that we have an SOP statement and hence it prints Parent class’s No arg constructor.
  • Now as the No argument const of Parent class completes so flow comes back to the no argument of the Child class and in that we have an SOP statement and hence it prints Flow comes back from Parent class no arg const.
  • Further after completing the no-argument constructor of child class flow now came back again to main and executes remaining statements and prints Inside Main.

We can use super() only inside constructor and nowhere else, not even in static context not even inside methods and super() should be first statement inside constructor. 

Java




// Java program to illustrate usage of
// super() as first statement
  
class Parent {
    Parent()
    {
        System.out.println("Parent class's No " +
                           "arg constructor");
    }
}
  
class Child extends Parent {
    Child()
    {
        // Uncommenting below line causes compilation
        // error because super() should be first statement
        // System.out.println("Compile Time Error");
        super();
  
        System.out.println("Flow comes back from " +
                       "Parent class no arg const");
    }
  
    public static void main(String[] args)
    {
        new Child();
        System.out.println("Inside main");
    }
}

Output:

Parent class's No arg constructor
Flow comes back from Parent class no arg const
Inside main

Note: super() should be first statement inside any constructor. It can be used only inside constructor and nowhere else. super() is used to refer only parent class’s(super class’s) constructor.

this() Keyword 

this() is used to call the current class’s constructor

Java




// Java code to illustrate usage of this()
  
class RR {
    RR()
    {
        this(10);
        System.out.println("Flow comes back from " +
                           "RR class's 1 arg const");
    }
  
    RR(int a)
    {
        System.out.println("RR class's 1 arg const");
    }
    public static void main(String[] args)
    {
        new RR();
        System.out.println(" Inside Main & quot;);
    }
}

Output:

RR class's 1 arg const
Flow comes back from RR class's 1 arg const
Inside Main

Flow of Program:

  • First, start from main and then in that we have made a statement new Child() hence which calls the no argument constructor of Child class, inside that we have this(10) which calls the 1 argument of the current class(i.e, RR class)
  • Since we have written this(10) and 1 argument that’s why it calls 1 argument constructor of RR class. In that, we have an SOP statement and hence it prints RR class’s 1 arg const.
  • Now as the 1 argument const of RR class completes so flow comes back to the no argument of the RR class and in that we have an SOP statement and hence it prints Flow comes back from RR class’s 1 arg const.
  • Further after completing the no argument constructor of RR class flow now came back again to main and executes remaining statements and prints Inside Main.

We can use this() only inside constructor and nowhere else, not even in static context not even inside methods and this() should be first statement inside constructor. 

Java




// Java program to illustrate usage of
// this() as first statement
  
class RR {
    RR()
    {
        // Uncommenting below line causes compilation
        // error because this() should be first statement
        // System.out.println("Compile Time
        // Error");
        this(51);
        System.out.println(
            " Flow comes back from RR & quot; + "
            class 1 arg const& quot;);
    }
    RR(int k)
    {
        System.out.println("RR class's 1 arg const");
    }
    public static void main(String[] args)
    {
        new RR();
        System.out.println(" Inside main & quot;);
    }
}

Output:

RR class's 1 arg constructor
Flow comes back from RR class 1 arg const
Inside main

Note: this() should be first statement inside any constructor. It can be used only inside constructor and nowhere else. this() is use to refer only the current class’s constructor.

Important points about this() and super()

  1. We can use super() as well this() only once inside constructor. If we use super() twice or this() twice or super() followed by this() or this() followed by super(), then immediately we get compile time error i.e, we can use either super() or this() as first statement inside constructor and not both.
  2. It is up to you whether you use super() or this() or not because if we are not using this() or super() then by default compiler will put super() as the first statement inside the constructor. 

Example

Java




// Java program to illustrate super() by default
// executed by compiler if not provided explicitly
  
class Parent {
    Parent()
    {
        System.out.println("Parent class's No " +
                          "argument constructor");
    }
    Parent(int a)
    {
        System.out.println("Parent class's 1 argument" +
                                      " constructor");
    }
  
}
  
class Base extends Parent {
    Base()
    {
        // By default compiler put super()
        // here and not super(int)
        System.out.println("Base class's No " +
                        "argument constructor");
    }
    public static void main(String[] args)
    {
        new Base();
        System.out.println("Inside Main");
    }
}

Output:
Parent class's No argument constructor
Base class's No argument constructor
Inside Main

Flow of program:

  • Inside main we have new Base() then flow goes to No argument constructor of Base class.
  • After that, if we don’t put either super() or this() then by default compiler put super().
  • So flow goes to Parent class’s No arg constructor and not 1 argument constructor.
  • After that, it prints Parent class’s No argument constructor.
  • After that when Parent() constructor completes the flow again comes back to that No argument constructor of Base class and executes next SOP statement i.e, Base class’s No argument constructor.
  • After completing that No argument constructor flow comes back to main() again and prints the remaining statements inside main() i.e, Inside main

Recursive constructor call not allowed 

Java




// Java program to illustrate recursive
// constructor call not allowed
 
class RR {
    RR() { this(30); }
    RR(int a) { this(); }
    public static void main(String[] args) { new RR(); }
}

Output:

Compile time error saying recursive constructor invocation

Flow of program: Here, above starts from main() and then flow goes to No arg constructor of RR class. After that, we have this(30) and flow goes to 1 arg constructor of RR and in that we have this() so again flow goes to No arg constructor of base class and in that again we have this(30) and flow again goes to 1 arg constructor of Base class and it goes on …… like a recursion. So it is invalid that’s why we get a compile-time error saying recursive constructor invocation. So recursive constructor invocations are not allowed in java.

Let us see the differences in a tabular form as follows:

super() keywordthis() keyword 
super() calls the parent constructorthis() can be used to invoke the current class constructor
It can be used to call methods from the parent.It can be passed as an argument in the method call.
It is returned with no arguments.It can be passed as an argument in the constructor call.
It can be used with instance members.It is used to return the current class instance from the method.

This article is contributed by Rajat Rawat. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or if you want to share more information about the topic discussed above.


My Personal Notes arrow_drop_up
Related Articles

Start Your Coding Journey Now!