我发现以下代码编译:
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设计师(创始人)认为它有效吗?
答案 0 :(得分:0)
最终方法可以由子类继承,无论子类是在父类之外还是在父类之内。但是你不能覆盖子类中的最终方法。如果最终方法是私有的,除非你的子类在父类中(如你的例子中),否则你不能在子类中继承它。
答案 1 :(得分:0)
由于您将方法声明为private,因此final无效并且是多余的。
覆盖私人方法真的没有多大意义。
然后从同一个类中的另一个方法(可能是公共的)调用类中的私有方法也没有什么不同。这通常是为了使代码更易读并且方法的大小可管理。
我不认为这是一个愚蠢的问题:)
以Builder-pattern为例。它利用私有构造函数来确保以正确的方式构造类。因此,了解您在不同范围内可用的内容,以及为什么重要:)
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类设为final,它仍然有效。而且你也无法将其子类化。换句话说,除了使用构建器之外,您确保没有其他方法来构造类的对象(除非使用反射)。