12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- 面向对象的三大特征:封装、继承、多态
- 多态
- 多态就是同一个对象,在不同时刻不同环境表现出来的不同形态。
- 多态的前提:
- 要具有继承关系(继承父类),或具有实现关系(实现接口)。
- 要进行方法的重写。
- 要【父类的引用指向子类的对象】
- 父类 对象名=new 子类();
- 多态有什么好处?
- 定义方法的时候,可以使用父类类型作为参数,在使用的时候,使用具体的子类的对象作为实际参数进行操作。
- class 食物{
- }
- 汉堡、炸鸡、凉皮、米粉、米饭...
- class Person{
- public void eat(食物 sw){ //在声明形式参数的时候,使用的父类类型的引用变量
- }
- }
- Person p=new Person();
- p.eat(new 汉堡()); //实际在调用方法并传递实际参数的时候,使用的是子类的对象。
- p.eat(new 炸鸡());
- p.eat(new 凉皮());
- p.eat(new 米粉());
- 多态有什么弊端?
- 不能使用子类特有的成员。解决方案:向下造型。
- 多态的转型:
- 向上转型 向上造型:
- 父类的引用指向子类的对象,就是向上造型
- Animal a=new Cat();
- 向下转型 向下造型:
- 子类类型 对象名=(子类类型)父类引用;
- Cat c=(Cat)a; //强行把父类的对象转化为子类
- 向下转型存在的风险和解决方案:
- 风险:
- 向下转型会带来一定的风险,如果对应的实际类型和目标类型不是同一种类型,
- 那么在转换的时候就会出现异常:ClassCastException类型强制转换异常
- 解决方案:
- 使用一个关键字 instanceof
- 使用的格式:
- 变量名(对象名) instanceof 类型
- 判断关键字左边的对象名,是不是右边的类型,如果是返回true,否则返回false。
- if(c instanceof Cat){
- Cat c=(Cat)a;
- }
|