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()”方法。又由于这个句柄指向子类对象,所以其只能操作子类中覆盖父类的方法。

【运行效果】编译错误,没有结果。

如果父类引用指向一个子类的对象,那么通过父类引用,只能调用父类所定义的允许继承的方法。如果子类重写了继承父类的方法,那么会调用子类中的方法。这些操作涉及一个隐含的知识点,就是值和地址。下一节将详细介绍。