C1.bar()被执行了,难道不是C2.bar吗?

时间:2019-08-24 22:50:08

标签: java this subclass super superclass

我同时设置了这两个类,作为学习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方法?

3 个答案:

答案 0 :(得分:1)

方法bar()是私有的。它不能被覆盖。 C2.bar仅在C2中可见,并且只能直接从C2调用。将bar()的可见性更改为两个C1C2中的受保护的或公开的,您将看到不同。

答案 1 :(得分:1)

由于C2.bar()方法是私有的,因此C1.bar()方法不会覆盖C1.bar()方法。但是,C1.foo()方法正在调用此确切方法C1.bar()。这样就得到了输出:

C1.foo()
C1.bar()

没有其他人正在调用“独立”方法C2.bar()。但是,当您将C1.bar()更改为protectedpublic时,所有这些都会改变。当需要覆盖时,您可以使用@Override注释来使意图清楚。当您不覆盖要覆盖的方法时,它将发出抱怨。

答案 2 :(得分:0)

 protected void foo() {
    System.out.println("C1.foo()");
    this.bar();
   }

这是因为this.bar()由C1类的foo()调用,所以C1类的bar()函数也被调用。