您的位置:首页 > 其它

多态

2016-02-15 20:17 232 查看
1.向上转型

【概念解释】将子类的对象赋值给父类的引用

Pet pet = new Dog("旺财", "狗");


* 不需要强制转换
* 可以访问父类的方法,属性,如果子类重写了,那么调用子类
* 无法访问子类特有的方法及属性(对子类方法或属性进行遮蔽)

【原因解释】
**一个引用能够调用哪些成员(变量和函数),取决于这个引用的类型**;所以子类向上转型之后,能调用哪些方法,取决于父类的类型;
**一个引用调用的是哪一个方法,取决于这个引用所指向的对象**;所以如果调用的属性和方法在子类中也存在,那么调用的是子类的属性和方法;

2.向下转型

【概念解释】将父类的对象赋值给子类的引用(向下转型的前提是向上转型)

//这是错误的
Person p = new Person();
Student s = (Student)p;
//这是正确的
Person p = new Student();//必须先向上转型
Student s = (Student)p;


* 需要强制转换
* 如果把一个类型转换成其他类型,编译没有报错,执行报:java.lang.ClassCastException --类转换异常
* 如果把一个类型转换成其他类型,然后再由其他类型转换回本类型,编译执行都通过

3.从属

* instanceof 来判断该引用类型变量所“指向”的对象是否属于该类

if(pet instanceof Dog){
//向下转型
((Dog) pet).bark();
}


4.接口的多态

>Fly接口

//向上转型   -- 类比 类的继承
Fly fly = new Bird();
//fly.fly();   //接口的多态表现形式
//向下转型
Bird bird = (Bird) fly;
bird.fly();


5.多态的体现

* 封装是为了保护属性的一种操作,继承是为了扩展类的功能

* 多态是由封装性和继承性引出的面向对象程序设计语言的另一特征。

* 重载:根据传入的参数不同,完成的功能也不同

* 重写:子类根据需求重写父类中的方法。

##静态多态性(编译时多态)
由方法重载(overload)实现

##动态多态性(运行时多态)
由方法重写(overridden)实现
子类对象可以作为父类对象使用。在程序中凡是需要父类对象的地方,都可以用子类对象代替。

调用规则:根据实例的类型决定调用的方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: