我发现以下代码可以编译:
class Ideone
{
public static void main (String[] args){
new Ideone().m();
}
final private void m(){
System.out.println("private final method");
}
class A extends Ideone{
public void method(String [] args){
m();
}
}
}
并执行。
我对此很纳闷。
您能解释为什么Java设计人员(创始人)使之起作用吗?
无论子类在父类之外还是在父类内部,最终方法都可以由子类继承。但是您不能在子类中覆盖final方法。如果final方法是私有方法,则除非您的子类在父类中(如您的示例中),否则您不能在子类中继承该方法。
因为您将方法声明为私有,所以final无效,并且是多余的。
覆盖私有方法实际上没有多大意义。
与在同一个类中的另一个方法(可能是公共的)中调用一个类中的私有方法没有什么不同。通常这样做是为了保持代码的可读性和方法的可管理性。
我不认为这是一个愚蠢的问题:)
例如,以Builder模式为例。它利用私有构造函数来确保以正确的方式构造类。因此,了解您在不同范围内可用的内容以及为什么很重要:)
class Ideone {
private String m;
private Ideone(String m) {
System.out.println("Build me with: " + m);
this.m = m;
}
public String getM() {
return m;
}
static class IdeoneBuilder{
String m;
public IdeoneBuilder withM(String m) {
this.m = m;
return this;
}
public Ideone build() {
return new Ideone(this.m);
}
}
public static void main (String[] args){
// new Ideone(); // will not compile
Ideone ideone = new IdeoneBuilder()
.withM("test").build();
}
}
编辑:您可以将Ideone类定为最终类,它将仍然有效。而且,您也无法对其进行子类化。换句话说,您确保除了使用生成器以外,没有其他方法可以构造类的对象(除非使用反射)。
答案是错误的。因为即使在继承概念中,子类也不能继承超类的私有成员。子类可以访问:1)如果子类与父类位于同一包中,则子类可以访问公共,默认,受保护的成员2)如果子类和父类位于不同的包中,则子类只能访问公共成员和受保护成员。