Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why do this() and super() have to be the first statement in a constructor?

Java requires that if you call this() or super() in a constructor, it must be the first statement. Why?

For example:

public class MyClass {     public MyClass(int x) {} }  public class MySubClass extends MyClass {     public MySubClass(int a, int b) {         int c = a + b;         super(c);  // COMPILE ERROR     } } 

The Sun compiler says "call to super must be first statement in constructor". The Eclipse compiler says "Constructor call must be the first statement in a constructor".

However, you can get around this by re-arranging the code a little bit:

public class MySubClass extends MyClass {     public MySubClass(int a, int b) {         super(a + b);  // OK     } } 

Here is another example:

public class MyClass {     public MyClass(List list) {} }  public class MySubClassA extends MyClass {     public MySubClassA(Object item) {         // Create a list that contains the item, and pass the list to super         List list = new ArrayList();         list.add(item);         super(list);  // COMPILE ERROR     } }  public class MySubClassB extends MyClass {     public MySubClassB(Object item) {         // Create a list that contains the item, and pass the list to super         super(Arrays.asList(new Object[] { item }));  // OK     } } 

So, it is not stopping you from executing logic before the call to super. It is just stopping you from executing logic that you can't fit into a single expression.

There are similar rules for calling this(). The compiler says "call to this must be first statement in constructor".

Why does the compiler have these restrictions? Can you give a code example where, if the compiler did not have this restriction, something bad would happen?

like image 958
Joe Daley Avatar asked Jul 22 '09 21:07

Joe Daley


People also ask

Why this and super should be the first statement in a constructor?

The Sun compiler says, call to super must be first statement in constructor . The Eclipse compiler says, Constructor call must be the first statement in a constructor . So, it is not stopping you from executing logic before the call to super() .

Why does the super () statement is used as the first statement of child constructor?

It happens because compiler itself adds super()(this invokes the no-arg constructor of parent class) as the first statement in the constructor of child class. Output: Constructor of parent class Constructor of child class Hello!

How are this () and super () used with constructors?

super() acts as immediate parent class constructor and should be first line in child class constructor. this() acts as current class constructor and can be used in parametrized constructors. When invoking a superclass version of an overridden method the super keyword is used.

How do constructors use this () and super () in Java?

“this()” is used to call the constructor of the current class and “super()” is used to call the constructor of the immediate parent class.


1 Answers

The parent class' constructor needs to be called before the subclass' constructor. This will ensure that if you call any methods on the parent class in your constructor, the parent class has already been set up correctly.

What you are trying to do, pass args to the super constructor is perfectly legal, you just need to construct those args inline as you are doing, or pass them in to your constructor and then pass them to super:

public MySubClassB extends MyClass {         public MySubClassB(Object[] myArray) {                 super(myArray);         } } 

If the compiler did not enforce this you could do this:

public MySubClassB extends MyClass {         public MySubClassB(Object[] myArray) {                 someMethodOnSuper(); //ERROR super not yet constructed                 super(myArray);         } } 

In cases where a parent class has a default constructor the call to super is inserted for you automatically by the compiler. Since every class in Java inherits from Object, objects constructor must be called somehow and it must be executed first. The automatic insertion of super() by the compiler allows this. Enforcing super to appear first, enforces that constructor bodies are executed in the correct order which would be: Object -> Parent -> Child -> ChildOfChild -> SoOnSoForth

like image 94
anio Avatar answered Sep 29 '22 06:09

anio