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