我同时设置了这两个类,作为学习this()和super()的区别和用法的示例,但是输出不符合预期
class C1 {
protected void foo() {
System.out.println("C1.foo()");
this.bar();
}
private void bar() {
System.out.println("C1.bar()");
}
}
class C2 extends C1 {
public void foo() {
super.foo();
}
public void bar() {
System.out.println("C2.bar");
}
public static void main(String[] args) {
new C2().foo();
}
}
据我所知,调用C2.foo()应该转到C2中定义的方法foo,之后语句super.foo()应该调用C1.foo(),并打印“ C1.foo()”并调用C2.foo(),因为调用super的类为C2,但是输出为:
C1.foo()
C1.bar()
为什么代码的行为如此?为什么this.bar();调用C1中定义的bar方法?
答案 0 :(得分:1)
方法bar()
是私有的。它不能被覆盖。 C2.bar
仅在C2
中可见,并且只能直接从C2
调用。将bar()
的可见性更改为两个类C1
和C2
中的受保护的或公开的,您将看到不同。
答案 1 :(得分:1)
由于C2.bar()
方法是私有的,因此C1.bar()
方法不会覆盖C1.bar()
方法。但是,C1.foo()
方法正在调用此确切方法C1.bar()
。这样就得到了输出:
C1.foo()
C1.bar()
没有其他人正在调用“独立”方法C2.bar()
。但是,当您将C1.bar()
更改为protected
或public
时,所有这些都会改变。当需要覆盖时,您可以使用@Override
注释来使意图清楚。当您不覆盖要覆盖的方法时,它将发出抱怨。
答案 2 :(得分:0)
protected void foo() {
System.out.println("C1.foo()");
this.bar();
}
这是因为this.bar()由C1类的foo()调用,所以C1类的bar()函数也被调用。