java中的继承具有混乱的输出

java中的继承具有混乱的输出,java,inheritance,Java,Inheritance,我提出这个问题: public class A { private void a() { System.out.println("a"); } public static void main(String[] args) { A t = new B(); t.a(); } } class B extends A { public void a() { System.out.printl

我提出这个问题:

public class A {

    private void a() {
        System.out.println("a");
    }

    public static void main(String[] args) {
        A t = new B();
        t.a();
    }
}


class B extends A {
    public void a() {
        System.out.println("b");
    }
}
这将打印输出:a

我不是很确定答案。 我知道如果您创建一个子对象并将其传递给父引用。它只运行通过一个函数重写的函数。 但是这里的功能是私有的,这是如何工作的


我知道这不是压倒一切的。但是为什么输出打印“a”?

尽管父类和子类都有方法a(),但它不是方法重写,因为父类a()是私有的

私有方法在类外不可见,甚至在它的子类中也不可见。在这里,类B不知道父类中存在同名的方法

因此,当您使用类a的引用调用a()时,它将调用类a的方法,而不是它的子类B的方法


如果将类a中方法a()的修饰符更改为public、protected或default,则可以看到方法重写行为。它会打印“b”

你不能重写一个
private
方法。
a()
是a上的私有函数,没有被继承。私有方法没有被继承你在这里没有真正重写
a()
,因为它是私有的,你的
b
对象将无法调用它。我根本没有说它的重写。我之所以这么说是因为它没有覆盖,为什么它会打印“a”,但您创建的对象是b而不是a。这意味着可以通过b的对象访问a的私有成员。听起来不对,不对。不能使用类B对象访问类A的私有成员。在您的例子中,编译器将a()视为类a的方法,而不是类B的方法。如果要从类B中删除方法a(),然后编写代码:B=新B();b、 a();它不会编译。