10.2.4 覆盖的多态性
覆盖为什么也具有多态性?因为父类的方法在子类中被重写。多态就是拥有多种形态,子类和父类的方法名称相同,只不过完成的功能不一样,所以说覆盖也具有多态性。
【实例10.6】通过上面的讲述,读者应该对多态有了很清晰的了解。下面再看一个多态的实例,主要是针对对象型的数据。
01 ///一个主运行类
02 ///创建一个父亲类型并且指向子类对象的对象句柄
03 ///运行这个句柄所指对象的方法
04 public class test
05 {
06 public static void main(String[]args)
07 {
08 father f=new son();
09 f.print();
10 }
11 }
12 ///创建一个父亲类
13 class father
14 {
15 public void print()
16 {
17 System.out.println("这是父亲的函数");
18 }
19 }
20 ///让儿子继承父亲类
21 class son extends father
22 {
23 public void print()
24 {
25 System.out.println("这是儿子的函数");
26 }
27 public void print1()
28 {
29 System.out.println("这是儿子的另一个函数");
30 }
31 }
【代码说明】以上程序段最关键的语句是第8行的“father f=new son()”,其将父类对象句柄指向了子类对象,实际上操作的还是子类对象,只不过将对象句柄声明为父类的数据类型。“f.print()”由编译器根据实际情况选择了子类的“print()”函数,所以输出的是子类的函数。
【运行效果】
这是儿子的函数
【实例10.7】将这个程序段修改后,再观察这个程序段的运行结果。
01 //一个主运行类
02 ///创建一个父亲类型并且指向子类对象的对象句柄
03 ///运行这个句柄所指对象的方法
04 public class test1
05 {
06 public static void main(String[]args)
07 {
08 father f=new son();
09 f.print1();
10 }
11 }
12 class father
13 {
14 public void print()
15 {
16 System.out.println("这是父亲的函数");
17 }
18 }
19 class son extends father
20 {
21 public void print()
22 {
23 System.out.println("这是儿子的函数");
24 }
25 public void print1()
26 {
27 System.out.println("这是儿子的另一个函数");
28 }
29 }
【代码说明】这个程序没有通过编译,因为“f”是父类的数据类型,那么在父类中没有“print1()”方法,只有“print()”方法。又由于这个句柄指向子类对象,所以其只能操作子类中覆盖父类的方法。
【运行效果】编译错误,没有结果。
如果父类引用指向一个子类的对象,那么通过父类引用,只能调用父类所定义的允许继承的方法。如果子类重写了继承父类的方法,那么会调用子类中的方法。这些操作涉及一个隐含的知识点,就是值和地址。下一节将详细介绍。