我发现编译了以下代码:
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方法。如果最后一个方法是私有的,那么除非你的子类在父类中,否则你不能在子类中继承它(就像你的例子中一样)。
由于您将方法声明为private,因此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成为最终的,它仍然有效。也就是说,你要确保除了使用构造器(除非使用反射)之外,没有其他方法可以构造你类的对象。