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

时间:2015-03-31 22:10:09

标签: java inheritance private inner-classes 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设计师(创始人)认为它有效吗?

2 个答案:

答案 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,它仍然有效。而且你也无法将其子类化。换句话说,除了使用构建器之外,您确保没有其他方法来构造类的对象(除非使用反射)。