Java 超类方法和子类方法

Java 超类方法和子类方法,java,oop,Java,Oop,请帮我查一下这个代码,谢谢 class Parent { int num = 4; protected void foo() { System.out.println("foo() of Parent"); } static protected void bar() { System.out.println("bar() of Parent"); } } class Child

请帮我查一下这个代码,谢谢

class Parent {
    int num = 4;

    protected void foo() {
        System.out.println("foo() of Parent");
    }

    static protected void bar() {
        System.out.println("bar() of Parent");
    }
}

class Child extends Parent {
    int num = 5;

    protected void foo() {
        System.out.println("foo() of Child");
    }

    static protected void bar() {
        System.out.println("bar() of Child");
    }
}

public class Test {
    public static void main(String[] args) {
        Parent f1 = new Parent();
        System.out.println(f1.num);

        Parent f2 = new Child();
        System.out.println(f2.num);

        Child c = new Child();
        System.out.println(c.num);

        f1.foo();
        f2.foo();
        c.foo();

        f1.bar();
        f2.bar();
        c.bar();
    }
}
结果如下:

4
4
5
foo() of Parent
foo() of Child
foo() of Child
bar() of Parent
bar() of Parent
bar() of Child

你能告诉我Person f2=new Child()是否为多态性吗?如果是,为什么'f2.num'的输出为4,而'f2.foo()'为'foo()'of Child'。
我认为这与超级类的静态条()有关。请告诉我原理,非常感谢。

是的,
Person f2=new Child()
是一种运行时多态性。您完全正确,因为
f2.num'
的输出是4,但是
f2.foo()
是子对象的
foo()。因为静态成员继承给子类,但有一些限制:

  • 您可以覆盖它们
  • 如果在子类中重新定义了方法,则父类的继承方法(
    bar()
    )将隐藏

因此,当您使用
父类
的引用创建对象
f2
时,正常的过程运行时多态性正在发生(将子对象与父对象绑定),但由于您重新定义了
bar()
方法,父方法被隐藏,子类
bar()
方法映射到此语句
f2.bar()

这听起来像是你在要求回答你的学业问题,我可能是错的,但如果是这样,那就不是真正的目的了。