Chinaunix首页 | 论坛 | 博客
  • 博客访问: 830344
  • 博文数量: 247
  • 博客积分: 166
  • 博客等级: 入伍新兵
  • 技术积分: 2199
  • 用 户 组: 普通用户
  • 注册时间: 2012-11-15 16:10
文章分类

全部博文(247)

文章存档

2017年(1)

2015年(63)

2014年(80)

2013年(94)

2012年(9)

分类: Java

2014-11-08 09:56:30

多态的概念

  多态==晚绑定

  不要把函数重载理解为多态。

  因为多态是一种运行期的行为,不是编译期的行为。

  多态:父类型的引用可以指向子类型的对象。

  比如 Parent p = new Child();

    当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;

    如果有,再去调用子类的该同名方法

  (注意此处,静态static方法属于特殊情况,静态方法只能继承,不能重写Override,如果子类中定义了同名同形式的静态方法,它对父类方法只起到隐藏的作用。调用的时候用谁的引用,则调用谁的版本。)

  (参考学习链接:)  

  如果想要调用子类中有而父类中没有的方法,需要进行强制类型转换,如上面的例子中,将p转换为子类Child类型的引用。

  因为当用父类的引用指向子类的对象,用父类引用调用方法时,找不到父类中不存在的方法。这时候需要进行向下的类型转换,将父类引用转换为子类引用。     

 

结合实例说明               

  下面举个例子(有问题的代码已注释):

  主要讲讲两种类型转换和两种编译时候的错误。  
      多态示例代码

点击(此处)折叠或打开

  1. 多态示例代码

  2. public class PolyTest
  3. {
  4.     public static void main(String[] args)
  5.     {
  6.         
  7.         //向上类型转换
  8.         Cat cat = new Cat();
  9.         Animal animal = cat;
  10.         animal.sing();

  11.                 
  12.         //向下类型转换
  13.         Animal a = new Cat();
  14.         Cat c = (Cat)a;
  15.         c.sing();
  16.         c.eat();


  17.         //编译错误
  18.         //用父类引用调用父类不存在的方法
  19.         //Animal a1 = new Cat();
  20.         //a1.eat();
  21.         
  22.         //编译错误
  23.         //向下类型转换时只能转向指向的对象类型
  24.         //Animal a2 = new Cat();
  25.         //Cat c2 = (Dog)a2;
  26.         


  27.     }
  28. }
  29. class Animal
  30. {
  31.     public void sing()
  32.     {
  33.         System.out.println("Animal is singing!");
  34.     }
  35. }
  36. class Dog extends Animal
  37. {
  38.     public void sing()
  39.     {
  40.         System.out.println("Dog is singing!");
  41.     }
  42. }
  43. class Cat extends Animal
  44. {
  45.     public void sing()
  46.     {
  47.         System.out.println("Cat is singing!");
  48.     }
  49.     public void eat()
  50.     {
  51.         System.out.println("Cat is eating!");
  52.     }
  53. }

  例子的执行结果:

  

  这段代码:  

 

  Cat类中定义了eat()方法,但是Animal类中没有这个方法,a1引用是Animal类的,所以找不到,编译时出错:

  

 

两种类型的类型转换

  (1)向上类型转换(Upcast):将子类型转换为父类型。

  对于向上的类型转换,不需要显示指定,即不需要加上前面的小括号和父类类型名。

  

 

  (2)向下类型转换(Downcast):将父类型转换为子类型。

  对于向下的类型转换,必须要显式指定,即必须要使用强制类型转换

  

 

  并且父类型的引用必须指向子类的对象,即指向谁才能转换成谁。

  不然也会编译出错:

 

 

  因为父类引用指向的是Cat类的对象,而要强制转换成Dog类,这是不可能的。

阅读(554) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~