这是一个典型的问题,当父类的引用指向子类的对象时,方法的调用是动态绑定到子类的方法上的。
具体如下:
sub是父类的引用类型变量,而他所指向的是子类的对象,此时sub虽然指向子类对象,但他只有访问父类里定义的成员的权利,此时调用sub.print()方法你可以这样理解:子类继承了父类,因此子类也拥有print方法,但具体的执行代码则要参考父类里的相应代码,即打印super1,然后调用over方法。此时注意,这个over方法是子类继承后又给覆盖了,因为上面说了方法动态绑定,所以调用的是子类的over方法,即打印sub1 S1,而此时的S1应该调用子类的成员S1,因此输出结果为:sub1   1。执行到这里,main方法中的print调用结束,该执行System.out.println(Sub.S1)语句了,由于sub是父类的引用类型,对于动态绑定只应用到方法,对于属性却不进行动态绑定,所以sub.S1的值为0,也就是父类里规定的值。