未分类
2020-08-11 06:51:13
1822677238@qq.com
手机扫码查看
面向对象三大特性之多态
生活中的人物视角
生活中,不同人物角色看待同一个对象的视角不同,关注点也不同
比如学生小明
在父母眼里他是儿子,在爷爷眼里他是孙子
在老师眼里他是学生,在同学眼里他是同学
生活中的多态
如果你看见 蜥蜴 你会说 它是什么?
蜥蜴?动物?爬虫?
生活中的多态是指`客观事物在人脑中的主观反应`
主观意识上的类别与客观存在的对象具有 “is a” 关系时,即形成多态
程序中的多态
概念:父类引用指向子类对象,从而产生多种形态
父类对象(引用类型)Animal a=new Dog();子类对象(对象类型)
二者具有直接或间接的继承关系时,父类引用可指向子类对象,即形成多态。
父类引用仅可调用父类所声明的属性和方法,不可调用子类独有的属性和方法。
多态中的方法覆盖
如果子类中覆盖了父类中的方法,以父类型引用调用此方法时,优先执行父类还是子类中的方法?
实际运行过程中,依旧遵循覆盖原则,如果子类覆盖了父类中的方法,则执行子类中覆盖后的方法,否则执行父类中的方法。
向上转型以及向下转型
public class demos{
public static void main(String[] args) {
//父类引用中保存真实子类对象称为向上转型(装箱)
Animal a=new Dog();
a.feed();
//a.run();ERROR,父类没有定义run方法,无法调用
//向下转型,转回自身类型
Dog d=(Dog)a;
d.feed();
d.run();
}
}
class Animal{
public void feed(){
System.out.println("Animal feed方法");
}
}
class Dog extends Animal{
public void feed() {
System.out.println("Dog的 feed方法");
}
public void run(){
System.out.println("Dog的 run方法");
}
}
instanceof关键字
public class demos{
public static void main(String[] args) {
Animal a=new Dog();
//向下转型前,应判断引用中的对象真实类型
// 保证类型转换的正确性
//关键字 instanceof
//语法 引用 instanceof 类型
if(a instanceof Cat){
Cat c=(Cat)a;
c.feed();
}else if(a instanceof Dog){
Dog d=(Dog)a;
d.feed();
}
}
}
class Animal{
public void feed(){
System.out.println("Animal feed方法");
}
}
class Dog extends Animal{
public void feed() {
System.out.println("Dog的 feed方法");
}
}
class Cat extends Animal{
public void feed(){
System.out.println("Cat的 feed方法");
}
}
总结
多态的两种应用场景:
1.使用父类作为方法形参 ,实现多态
1.1调用方法时,可传递的实参类型包括:本类型对象+ + 其所有的子类对象
2.使用父类作为方法返回值,实现多态
2.1调用方法后,可得到的结果类型包括:本类型对象+ + 其所有的子类对象
多态的作用:
屏蔽子类间的差异; 灵活、耦合度低



发表回复