2015-02-17 50 views
0

这是我的代码为什么在这里调用超类方法?

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 

如果我是写在Hellometh方法,公众和HelloWorld

结果覆盖它WUD被上述一。 methmethod调用仍然会调用子类的meth,即使meth调用在超类中,从词汇上讲! 那么为什么meth是私人时的不同行为?

_____________Edit_____________

有码过这样的事情

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就是bein g叫。所以,方法调用不在词汇意义上!即使看起来超类的方法会被调用,其实际的子类的becoz子类实例首先调用method。 为什么不同meth私人超级

回答

3

当编译器告诉你,你不能重载一个私有方法。所以超类所知道的唯一方法就是它自己的。

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

+0

我同意!但即使控件位于超类中,它仍然是调用镜头的子类对象。这就是为什么该方法不是私有的,子类方法版本会被调用。现在在这种情况下,正如你所说的,私有超类方法甚至不知道是由子类实例存在的。因此,如果子类实例实际上是从超类方法内部调用子类meth(),它就是自然的了。 请澄清我的概念是否错误 – Sarabjeet 2015-02-17 21:09:13

1

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

+0

我同意!但即使控件位于超类中,它仍然是调用镜头的子类对象。这就是为什么该方法不是私有的,子类方法版本会被调用。现在在这种情况下,正如你所说的,私有超类方法甚至不知道是由子类实例存在的。因此,如果子类实例实际上是从超类方法内部调用子类meth(),它就是自然的了。 请澄清,如果我的观念是错误的 – Sarabjeet 2015-02-17 21:08:25

0

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

我会建议在继承阅读了: Java Inheritance

相关问题