多态

来源:互联网 发布:永硕网盘源码 编辑:程序博客网 时间:2024/06/06 03:57

多态:多种状态,比如说中文翻译成意思相同的多种语言。

多态指的是编译时类型变化,而运行时类型不变。

多态分两种:
编译时多态:编译时动态重载;
运行时多态:指一个对象可以具有多个类型。 

对象是客观的,人对对象的认识是主观的


Animal a=new Dog();

查看格式名称,(编译时看左边,运行时看右边) 

Dog d=(Dog)a

声明父类来引用子类。(强制转换) 


编译时类型一定要为运行时类型的父类(或者同类型)

对于语句:

Dog d=(Dog)a

将 d 强制声明为 a 类型

此时 d 为 Dog(),此时 d 就 可以调用运行时类型

注意:a 和 d 指向同一对象


多态:指同一个实体同时具有多种形式

好比,你去面馆吃面,说我要吃面,那么;老板给我牛肉面,鸡蛋面等都可以,

这就是说"面"有多种形态,也就是说实体有多种形态;

编译时的类型由声明该变量时使用的类型决定,

运行时的类型由实际赋给变量的对象决定。

如果编译时类型和运行时类型不同,就出现多态。

 

前提:Student  extends   Person:

Person p = new Person();

Student s = new Student();

Person p = new Student();//多态

 

引用关系:父类变量指向子类实例对象

多态的体现

父类的引用指向自己的子类对象

父类的引用也可以接受自己的子类对象

父类的引用只能访问父类中的成员


多态实现的前提是类与类之间是有继承或实现关系且存在覆盖


实现多态的机制:

父类的引用变量可以指向子类的实例对象,而程序调用的方法在运行期才动态绑定,就是引用变量所指向的真正实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。 

 

多态的作用:

把不同的子类对象都当作父类来看,可以屏蔽不同子类对象之间的差异,写出通用的代码,做出通用的编程,以适应需求的不断变化。

只修改方法的实现,不必修改方法的声明

继承是多态产生的前提条件;

 

分类:

编译时多态:方法重载

运行时多态:方法覆写


多态时,成员的特点:
成员变量
编译时;
参考引用型变量所属的类中的是否有调用的成员变量,有,编译通过,没有,编译失败。

运行时;参考引用型变量所属的类中的是否有调用的成员变量,并运行该所属类中的成员变量。
简单说:编译和运行都参考等号的左边。

成员函数(非静态)。
编译时:参考引用型变量所属的类中的是否有调用的函数。有,编译通过,没有,编译失败。
运行时:参考的是对象所属的类中是否有调用的函数。
简单说:编译看左边,运行看右边。
因为成员函数存在覆盖特性。

静态函数
编译时:参考引用型变量所属的类中的是否有调用的静态方法。
运行时:参考引用型变量所属的类中的是否有调用的静态方法。
编译和运行都看左边。
静态方法,是不需要对象的。直接用类名调用即可。


0 0