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 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.