Java继承

vad*_*vad 11 java inheritance class

为什么打印最后"我是儿童班." ?

public class Parent
{
    String parentString;
    public Parent()
    {
        System.out.println("Parent Constructor.");
    }

    public Parent(String myString)
    {
        parentString = myString;
        System.out.println(parentString);
    }

    public void print()
    {
       System.out.println("I'm a Parent Class.");
    }
} 

public class Child extends Parent
{
    public Child() {
        super("From Derived");
        System.out.println("Child Constructor.");
    }

    public void print()
    {
       super.print();
       System.out.println("I'm a Child Class.");
    }

    public static void main(String[] args)
    {
        Child child = new Child();
        child.print();
        ((Parent)child).print();
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

From Derived

Child Constructor.

I'm a Parent Class.

I'm a Child Class.

I'm a Parent Class.

I'm a Child Class.
Run Code Online (Sandbox Code Playgroud)

Boz*_*zho 15

因为这是多态性(后期绑定)的一个例子.在编译时,您指定对象是类型Parent,因此只能调用在中定义的方法Parent.但是在运行时,当发生"绑定"时,会在对象上调用该方法,Child无论代码中如何引用它都是类型的.

令您惊讶的部分是为什么应该在运行时调用重写方法.在Java中(与C#和C++不同),所有方法都是虚拟的,因此调用了重写方法.请参阅此示例以了解其中的差异.