这是我的代码
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
私有时事情不同
答案 0 :(得分:3)
您无法覆盖编译器告诉您的私有方法。所以超类所知道的唯一的meth()是它自己的。
你不能覆盖私有方法,因为它在类的内部,所以它的子类甚至不知道它的超级私有方法存在。
答案 1 :(得分:1)
您的方法meth()
为private
,且子类无法访问它。
答案 2 :(得分:0)
Super类从它自己调用meth(),因此,它正在寻找this.meth()。 super甚至不知道子类的meth()因为1)它在子类中,2)子类方法是私有的。
我建议阅读继承: Java Inheritance