为什么在这里调用超类方法?

时间:2015-02-17 21:01:34

标签: java inheritance private method-overriding

这是我的代码

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方法公开为公开方式,并在HelloWorld

中覆盖它

结果是上述的结果。 来自meth的{​​{1}}调用仍会调用子类的method,即使这个调用是在超级类中,从词汇上讲! 那么为什么meth私有时的不同行为呢?

_____________编辑_____________

代码是这样的

meth

o / p将是

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();
     }
}

因此,即使超类super method sub meth 中的method正在调用Hello,实际上也会调用子类的meth。所以,方法调用不是词汇意义上的!即使看起来超级类的方法将被调用,它的实际子类的becoz子类实例首先调用meth。 为什么在超级班级中method私有时事情不同

3 个答案:

答案 0 :(得分:3)

您无法覆盖编译器告诉您的私有方法。所以超类所知道的唯一的meth()是它自己的。

你不能覆盖私有方法,因为它在类的内部,所以它的子类甚至不知道它的超级私有方法存在。

答案 1 :(得分:1)

您的方法meth()private,且子类无法访问它。

答案 2 :(得分:0)

Super类从它自己调用meth(),因此,它正在寻找this.meth()。 super甚至不知道子类的meth()因为1)它在子类中,2)子类方法是私有的。

我建议阅读继承: Java Inheritance