多态性与虚函数类的继承与多态性实验报告
1.介绍
2.什么是多态
3.多态在Java中的技术基础
4.示例
5.多态的好处
6.总结
介绍
之前的文章介绍过类的封装性继承性,现在是时候聊聊面向对象编程的三大特性之一的最后一个类的多态性了。
多态的基础是继承(包括了接口的实现)和方法的覆盖。
什么是多态
多态对应的英文单词是polymorphism,百度翻译给出的翻译是:
n.多型现象,多态性; 多机组合形式;
按字面意思就是多种状态、形态、姿态等等,潜台词就是某个东西具有多种状态、形态、姿态等等。
那是什么东西呢?在面向对象的编程语言里面(当然就包括Java了)就是某个方法或函数
那方法的多种状态、形态、姿态有是个什么意思呢?这其实是指同一个方法具有多个方法体,就是方法的实现。而方法的相同与否是由方法签名决定的。
所以,多态其实本质上是指同一个类的同一个方法却具有不同的行为特征。状态、形态、姿态指的就是行为特征。
多态在Java中的技术基础
然而,在Java中,同一个类里面是不可能存在两个签名相同而实现不同的方法的,否则的话会导致无法判断该执行哪个方法,因此在编译时就会报错。
所以,肯定是在两个类中才有可能存在两个签名相同而实现不同的方法,一个实现在这个类,另一个实现在另一个类。
而如果这两个类毫无瓜葛,那么肯定就与多态的本质(同一个类的同一个方法却具有不同的行为特征)自相矛盾了。
所以,这两个类肯定是有某种联系的。我们再想想,什么概念是能够让两个不同的类却又能称为同一个类的?
答案就是类的继承/扩展,就是现实中的“某东西是某类东西”的概念,就是“具体和抽象”的思想。
比如,男人是人,女人也是人,男人类和女人类就借助于人类建立了某种联系,而人类具有的某个行为在男人类和女人类中是有着不同体现的,比如人类的吃饭这个行为,男人类的体现是狼吞虎咽,女人类的体现是细嚼慢咽。例子不是很恰当,但意思就是这么个意思。
所以说,Java里面多态的技术基础就是方法的覆盖,当然,在Java中覆盖不仅仅发生在类的继承/扩展上,还可能发生在接口的实现上。只有覆盖才能满足两个方法签名相同而实现不同,却又能统一在同一个类(超类或接口)的同一个方法之中。
示例
人类:
ample;
public class Person {
    public void eat() {
        System.out.println("我在吃饭!");
    }
}
男人类:
ample;
public class Man extends Person {
    public void eat() {
        super.eat();//人类都要吃饭
        System.out.println("我狼吞虎咽地吃!");
    }
}
女人类:
ample;
public class Woman extends Person {
    public void eat() {
        super.eat();//人类都要吃饭
        System.out.println("我细嚼慢咽地吃!");
    }
}
使用人类的外部模块:
ample;
/**
*
* 外部模块,使用Person类
* 可以用Man类和Woman类的对象来配置此模块
*
*/
public class OuterModule {
    public static void main(String[] args) {
        Person p = new Man();//相当于配置
        p.eat();
       
        p = new Woman();//相当于配置
        p.eat();
    }
}
执行结果可以看出,对同一个类(Person)的同一个方法(eat)的调用,执行结果却不一样,这就是多态!
其根本原因还是在于调用该方法的引用类型变量指向的是一个子类或接口实现类的对象。所以,我们只要为这个变量配置不同的子类或接口实现类的对象即可获得不同的执行结果。
这好像有点类似于C语言的函数指针,本质上不过是把一段代码包装成数据,然后就可以将它赋值某种特殊类型的变量(实际上代表的是数据存放的地址而已),比如函数指针或引用类型变量,然后就可以用该变量来到该段代码,从而执行该段代码。