I’m a bit stuck on this SCJP practice question, specifically line 5 (with the String constructor). I thought it should be private, but the solution is ‘protected’. I think protected access would not satisfy the requirement that all Alpha instances have the String alpha set to A. If the constructor is protected, then any other class that’s also in package alpha, OR any subclass of Alpha regardless of package, can invoke it and set alpha to whatever it wants. Amirite? Can anyone clarify? Thanks!

If the constructor were private, how would Beta call
super(a)?So it can’t be private… but you’re right: if it’s
protectedthen other types in the same package could indeed callIn other words, I don’t believe
privateis 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
Alphaabstract, and do what you like with the constructor, so long as it’s visible toBeta(publicorprotectedis fine). That way the third condition is automatically true, because there will never be any instances of justAlpha!Now, this does require a bit of a weaselly interpretation of point 1. I would argue that an instance of
Betais an instance ofAlpha(after all,instanceofwill return true 🙂 so that satisfies point 1, but an instance ofBetais not “an object of typeAlpha” so point 3 is still okay.