这是我的代码

class Hello{
    void method(){
        System.out.println("super method");
        meth();
    }
    private void meth(){
        System.out.println("sup meth");
    }
}
public class HelloWorld extends Hello{
    //@Override - would fail as meth is private in Hello
    protected void meth(){
        System.out.println("sub meth");
    }
    protected void method(){
        super.method();
    }
     public static void main(String []args){
        new HelloWorld().method();
     }
}


返回的结果是

super method
sup meth


但为什么 ?不应该打印吗

super method
sub meth


如果我要在meth中将Hello方法写为public,并在HelloWorld中覆盖它

结果将是上述之一。
meth调用method仍然会调用子类的meth,即使从甲基苯胺的调用是在超类内部,从词法上讲!
那么,为什么meth是私有的时候为什么会有不同的行为呢?

_____________编辑_____________

如果代码是这样的

class Hello{
    void method(){
        System.out.println("super method");
        meth();
    }
    protected void meth(){
        System.out.println("sup meth");
    }
}
public class HelloWorld extends Hello{
    //@Override - would fail as meth is private in Hello
    protected void meth(){
        System.out.println("sub meth");
    }
    protected void method(){
        super.method();
    }
     public static void main(String []args){
        new HelloWorld().method();
     }
}


O / P将是

super method
sub meth


因此,即使超类method中的Hello调用了meth,实际上子类的meth也被调用了。因此,方法调用不是词汇意义上的!即,即使似乎将调用超类的meth,它的实际子类的becoz子类实例也会首先调用method
为什么在超类中meth私有时情况会有所不同

最佳答案

您不能覆盖编译器告诉您的私有方法。因此,超类唯一知道的meth()是它自己的。

您不能覆盖私有方法,因为它是类内部的,因此它的子类甚至都不知道其父类的私有方法是否存在。

10-08 03:27