Thursday, 16 June 2016

What consequence as declaring a private non-arg constructor?

In inheritance context:

private constructor is invisible to the sub-classes. This might cause a compiling error, "no suitable constructor found" as defining a subclass, especially as a non-arg user-defined constructor has been explicitly defined.

Here is a case: Line //1 generates a compiling error.

Reasons:

1) as having no any user-defined constructor, Java will automatically add a default constructor.
2) a default constructor is non-arg constructor, in which super() will be added in the first line; and instance variable will be init. immediately following.

/**
 *
 * @author YNZ
 */
class A {
    int a;
    int b;

    //invisible to subclass
    private A() {

    }

    public A(int a, int b) {
        this.a = a;
        this.b = b;
    }

    protected A(float a, int b) {
        this.a = (int) a;
        this.b = b;
    }

}

class B extends A {  //1

}






how about removing it?
class A {
    int a;
    int b;

    public A(int a, int b) {
        this.a = a;
        this.b = b;
    }

    protected A(float a, int b) {
        this.a = (int) a;
        this.b = b;
    }

}

class B extends A {  //1

}

this will still cause the same compiling error. since there is only argument constructors have been defined, the sub-class will think, non-argument constructor has no been defined.

How about removing all constructors from A? it should be correct. As compiling time, a default non-arg constructor will be added by Java with in the A; and a default non-argument constructor will be added by Java with in the B, in which a super() being invoked from the A.


So the following should be correct.
class A {
    int a;
    int b;
}

class B extends A {  //1

}

No comments:

Can Jackson Deserialize Java Time ZonedDateTime

Yes, but must include JSR310. Thus ZonedDateTime can be deserialized directly from JSON response to POJO field. <dependency> <g...