为什么我可以从内部类继承final方法



我发现编译了以下代码:

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成为最终的,它仍然有效。也就是说,你要确保除了使用构造器(除非使用反射)之外,没有其他方法可以构造你类的对象。

最新更新