开发者

Why should the String constructor be protected instead of private here?

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 sat开发者_开发知识库isfy 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!

Why should the String constructor be protected instead of private here?


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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜