This constellation does not break any other rules besides good OO design. Java is prepared for this case, because all fields of B get initialized even before any of the constructors get invoked, as shown by the following example:
public class A {
int aMember;
public static final void main(String[] args) {
new B();
}
A() {
B b = (B) this;
System.out.println("in A(), before b.bMember has been set here, b.bMember = " + b.bMember);
System.out.println("in A(), before this.aMember has been set here, this.aMember = " + this.aMember);
this.aMember = 5;
b.bMember = 1; // will be overwritten in B()
System.out.println("in A(), after b.bMember has been set here, b.bMember = " + b.bMember);
System.out.println("in A(), after this.aMember has been set here, this.aMember = " + this.aMember);
}
}
--
public class B extends A {
int bMember;
B() {
super(); // invokes A()
System.out.println("in B(), before this.bMember has been set here, this.bMember = " + this.bMember);
this.bMember = 6;
System.out.println("in B(), after this.bMember has been set here, this.bMember = " + this.bMember);
}
}
This outputs:
in A(), before b.bMember has been set here, b.bMember = 0
in A(), before this.aMember has been set here, this.aMember = 0
in A(), after b.bMember has been set here, b.bMember = 1
in A(), after this.aMember has been set here, this.aMember = 5
in B(), before this.bMember has been set here, this.bMember = 1
in B(), after this.bMember has been set here, this.bMember = 6
That means that in A(), B's member variables are simply in the same state as A's member variables before they get set. Both have been initialized to their defaults (0 for int, false for boolean, null for objects, ...) and can be used. A strong pitfall is that B's member variables can be set in A(), but can be overwritten by B's own constructor, which is very counterintuitive.
I like this question because it is expressed simply and clearly, yet it raises more complicated questions, which reach into other topics like compiler internals and details in object creation.