- 什么是多态?
- 对象的多种形态
- 多态的前提
- 有继承或实现关系
- 有父类引用指向子类对象
- 有方法的重写
- 多态的好处
- 使用父类型的引用数据类型作为参数,可以接收所有子类对象
- 这极大地体现了多态的扩展性和便利
- 多态格式:
- 父类类型 变量名=new 子类/实现类构造器;
变量名.方法名();
- 多态的运行特点:
- 调用成员变量时:编译看左边,运行看左边
- 编译时看看父类有没有此变量,没有便报错(编译看左边)
运行时调用父类的成员变量(运行看左边)
- 编译时看看父类有没有此变量,没有便报错(编译看左边)
- 调用成员方法时:编译看左边,运行看右边
- 编译时看看父类有没有此成员方法,没有便报错(编译看左边)
调用时调用子类的成员方法
- 编译时看看父类有没有此成员方法,没有便报错(编译看左边)
- 多态的弊端
- 多态编译阶段只看左边父类类型的成员变量和成员方法,子类独有的成员变量和成员方法便无法访问
- 不过这正是归类和分类的思想体现,多态只针对子类之间的共有特征.
- 多态的转型
- 多态的转型分为上转型(自动转换)和下转型(强制转换)
- 上转型:
父类类型 变量名 = new 子类类型();
Animal a = new Cat();
父类对子类来说是更大范围的类型,故可自动转换 - 下转型:
父类类型 变量名 = new 子类类型();
子类类型 变量名=(子类类型)父类类型;
Animal a=new Cat();
Cat c=new(Cat) a;
子类范围更小,只能强制转换
注意:子类不可强制转换为另一个子类,会报错
- 上转型:
- instanceof关键字
-
为了避免ClassCastException的发生,Java提供了 instanceof 关键字,给引用变量做类型的校验,格式如下:
- 变量名 instanceof 数据类型
如果变量属于该数据类型或者其子类类型,返回true。
如果变量不属于该数据类型或者其子类类型,返回false。
所以,转换前,我们最好先做一个判断,代码如下:
- 变量名 instanceof 数据类型
public class Test {
public static void main(String[] args) {
// 向上转型
Animal a = new Cat();
a.eat(); // 调用的是 Cat 的 eat
// 向下转型
if (a instanceof Cat){
Cat c = (Cat)a;
c.catchMouse(); // 调用的是 Cat 的 catchMouse
} else if (a instanceof Dog){
Dog d = (Dog)a;
d.watchHouse(); // 调用的是 Dog 的 watchHouse
}
}
}
希望这杯Java满你心意,还请多多一键三连