< 示例1>
<练习>
这个地方就是多态的一个陷阱; 多态是对方法而言的,不是对变量; s1 a = new s2();这里生成的对象是s1类的实例,但是是由s2类构造的; java中对变量的选择是静态的,对方法的选择是动态的,是在运行时决定的。(static除外) 运行时实际上调用的是实例的方法,即s1的方法;但对于继承(多态的一种方式),方法的定位是在动态执行时选择的,选择实际构造者,因此就出现了本题的现象了。 另外:多态是对方法而言的,不是对变量;这样说有些不严密,方法应该有个修饰,就是除了final修饰的方法外,java中对函数的调用都是后期绑定,所谓的后期绑定就是动态选择 摘自 崔毅解答csdn疑问时给出的分析 注意以下的方法都被修饰了final < 示例2>以下哪里会出错?
op2.f(); 处出错! <示例3>
分析
多态:
Java 中的函数,除了声明外 final 的外,都是后期绑定。
所谓绑定是建立“函数调用”和“函数本体”的关联。、
所谓的后期绑定是指执行时根据对象类别而进行
多态仅仅对函数而言,不对变量而言;
变量的访问依赖于编译期引用指向的类型;
方法的访问依赖于执行期对象的类型;
向上转型后,调用某个函数,若 derived class overriding 了该函数,则会调用该 derived class 中的函数,否则会调用 base class 中的函数。
向上转型后,只能调用 base class 中被 derived class overriding 的函数,不能调用 derived class 中 extend 函数。
即向上转型后,只能调用 base class 中的方法,不能调用 derived class 中的扩展方法