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

Joe Darcy joe.darcy at oracle.com
Sat Oct 8 19:42:44 PDT 2011


Ulf Zibis wrote:
> Anyway,
>      int c = a + b;
> doesn't affect any object field initialization.
> It's just a local variable, which gets lost after the instance is instantiated.
>
> As workaround, you can always use a static helper method which does the same:
>      super(staticHelper(a, b));
>
> So I agree, it would reasonable, to allow some code in advance of this() or super().
>
> + 1 for your proposal, Vimil Saju.
>   

This is not a proposal, it is a question!

The answer to the question has already been given on the list: since 
superclass state of the object is not initialized until after the 
superclass constructor is called, the Java language requires that a call 
to a superclass constructor occur in the first statement of a subclass 
constructor in an attempt to reduce logic errors in initialization.

This restriction is annoying at time, but no one has put forward a 
detailed proposal for how the requirement could be sensibility loosened 
in a way that can be standardized and tested.

-Joe

> -Ulf
>
>
>
> Am 08.10.2011 01:39, schrieb Daniel Yokomizo:
>   
>> On Oct 7, 2011 1:58 PM, "Paul Benedict"<pbenedict at apache.org>  wrote:
>>     
>>> It's a compiler error because the superclass is guaranteed to be
>>> initialized first before the subclass.
>>>       
>> Not guaranteed by the JVM, as in anonymous inner classes.
>>
>>     
>>> On Fri, Oct 7, 2011 at 11:51 AM, Vimil Saju<vimilsaju at yahoo.com>  wrote:
>>>       
>>>> If you have subclass then java requires that this() or super has to be
>>>>         
>> first statement in the constructor of the subclass.
>>     
>>>> Here is an example
>>>>
>>>> publicclassMyClass{
>>>>          publicMyClass(intx){}
>>>> }
>>>>
>>>> publicclassMySubClassextendsMyClass{
>>>>          publicMySubClass(inta,intb){
>>>>                  intc =a +b;
>>>>                  super(c); // COMPILE ERROR
>>>>          }
>>>> }The above compilation error can be resolved by rewriting the code in
>>>>         
>> the constructor as follows
>>     
>>>> publicclassMySubClassextendsMyClass{
>>>>          publicMySubClass(inta,intb){
>>>>                  super(a + b);
>>>>          }
>>>> }Can't the Java compiler detect that in the previous code there was no
>>>>         
>> access to the instance fields or methods and therefore allow the code to
>> compile without any error.
>>     
>
>   




More information about the coin-dev mailing list