If the constructor were private, how would Beta call super(a)?
So it can't be private... but you're right: if it's protected then other types in the same package could indeed call
new Alpha("some other value")
In other words, I don't believe private is the right answer, but I don't believe there is a right answer. You can't limit visibility to only derived classes in Java.
EDIT: I've got it :)
Make Alpha abstract, and do what you like with the constructor, so long as it's visible to Beta (public or protected is fine). That way the third condition is automatically true, because there will never be any instances of just Alpha!
package alpha;
public abstract class Alpha {
final String alpha;
Alpha() { this("A"); }
public Alpha(String a) { alpha = a; }
}
package beta;
public class Beta extends alpha.Alpha {
public Beta(String a) { super(a); }
}
Now, this does require a bit of a weaselly interpretation of point 1. I would argue that an instance of Beta is an instance of Alpha (after all, instanceof will return true :) so that satisfies point 1, but an instance of Beta is not "an object of type Alpha" so point 3 is still okay.