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();它不会编译。