首页 > 其他 > 详细

面向对象编程(十四)——面向对象三大特性之多态①

时间:2016-02-14 16:53:56      阅读:325      评论:0      收藏:0      [点我收藏+]

面向对象第三大特征:多态

多态(polymorphism)

多态是面向对象的重要特性,简单点说:“一个接口,多种实现”,就是同一种事物表现出的多种形态。
编程其实就是一个将具体世界进行抽象化的过程,多态就是抽象化的一种体现,把一系列具体事物的共同点抽象出来, 再通过这个抽象的事物, 与不同的具体事物进行对话。

一个程序跑起来需要经过编译→运行。而多态是一种运行期的行为,不是编译期的行为。

    • 多态性是OOP中的一个重要特性,主要是用来实现动态联编的,换句话说,就是程序的最终状态只有在执行过程中才被决定而非在编译期间就决定了。这对于大型系统来说能提高系统的灵活性和扩展性。
    • Java中如何实现多态?使用多态的好处?
      • 引用变量的两种类型:
        • 编译时类型(模糊一点,一般是一个父类)
          • 由声明时的类型决定。
        • 运行时类型(运行时,具体是哪个子类就是哪个子类)
          • 由实际对应的对象类型决定。

多态的存在要有3个必要条件

    (多态是指方法的多态,属性没有多态)
    • 要有继承
    • 要有方法重写
    • 父类引用指向子类对象

【多态 示例1】

 1 package com.gta.testoop.polymorphism;
 2 
 3 public class Animal {
 4     public void voice(){
 5         System.out.println("普通动物叫声!");
 6     }
 7 }
 8 
 9 class Cat extends Animal{
10     //方法重写
11     public void voice() {
12         System.out.println("喵喵喵~");
13     }
14 }
15 
16 class Dog extends Animal{
17     //方法重写
18     public void voice() {
19         System.out.println("汪汪汪~");
20     }
21 }
22 
23 class Pig extends Animal{
24     //方法重写
25     public void voice() {
26         System.out.println("哼哼哼~");
27     }
28 }

测试类:

(如果没有采用多态,如下所示)

 1 public class Test {
 2     //如果没有多态,采用方法重载
 3     public static void testAnimalVoice(Cat c){
 4         c.voice();
 5     }
 6     
 7     public static void testAnimalVoice(Dog d){
 8         d.voice();
 9     }
10     
11     public static void testAnimalVoice(Pig p){
12         p.voice();
13     }
14     
15     public static void main(String[] args) {
16         // TODO Auto-generated method stub
17         Cat c=new Cat();
18         testAnimalVoice(c);
19     }
20 
21 }

采用多态,如下所示:

 1 public class Test {
 2     //采用多态
 3     public static void testAnimalVoice(Animal a){//Animal是a的编译时类型
 4         a.voice();
 5     }
 6     
 7     public static void main(String[] args) {
 8         //①向上类型转换
 9         Cat c=new Cat();//创建一个Cat对象c,Cat是Animal的子类;
10 //        Animal a=c;
11         testAnimalVoice(c);//Cat是运行时类型,实际是执行Animal a=c;再执行testAnimalVoice方法。
12     
13         //上面①等价于②:向下类型转换
14         Animal c1=new Cat();//父类引用指向子类对象
15         testAnimalVoice(c1);
16         
17     }
18 }

如果子类有新方法:

技术分享

则:

技术分享

此处报错,Animal没有编译。Animal类里没有catchMouse方法,c1引用是Animal类,所以找不到该方法,编译通不过。

可以采用强制转型,将c1再转回Cat型。

技术分享

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

  比如 Parent p = new Child();

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

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

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

向上类型转换(Upcast)和向下类型转换(Downcast)

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

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

技术分享

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

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

技术分享

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

  不然也会编译出错:

技术分享

技术分享

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

instanceof关键字

instanceof是Java的一个二元操作符,和==,>,<是同一类东东。由于它是由字母组成的,所以也是Java的保留关键字。它的作用是测试它左边的对象是否是它右边的类的实例,返回boolean类型的数据

技术分享

下一篇:

面向对象编程(十四)——面向对象三大特性之多态②

面向对象编程(十四)——面向对象三大特性之多态①

原文:http://www.cnblogs.com/Qian123/p/5181577.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!