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

问题描述 投票:0回答:3

我发现以下代码可以编译:

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设计人员(创始人)使之起作用吗?

java inheritance private inner-classes final
3个回答
0
投票

无论子类在父类之外还是在父类内部,最终方法都可以由子类继承。但是您不能在子类中覆盖final方法。如果final方法是私有方法,则除非您的子类在父类中(如您的示例中),否则您不能在子类中继承该方法。


0
投票

因为您将方法声明为私有,所以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类定为最终类,它将仍然有效。而且,您也无法对其进行子类化。换句话说,您确保除了使用生成器以外,没有其他方法可以构造类的对象(除非使用反射)。


0
投票

答案是错误的。因为即使在继承概念中,子类也不能继承超类的私有成员。子类可以访问:1)如果子类与父类位于同一包中,则子类可以访问公共,默认,受保护的成员2)如果子类和父类位于不同的包中,则子类只能访问公共成员和受保护成员。

© www.soinside.com 2019 - 2024. All rights reserved.