多态
什么是多态?
多态是OOP面向对象编程的第三个特点。表现为:对象多态、行为多态。
多态性是允许你将父类引用设置成为一个或更多的他的子对象相等的技术,赋值之后,父类引用就可以根据当前赋值给它的子对象的特性以不同的方式运作。
public class Test {
public static void main(String[] args) {
A a=new B();//多态
A a1=new C();//一个对象具有多种形态的表现。
a.show();
a1.show();
}
}
这种多态实现的前提:必须有继承关系。
对象多态
多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作. 简单的说,就是一句话:允许将子类类型赋值给父类类型
多态:父类对象表现多种子类的形态的能⼒的特征,⼀句话多态就是⽗类引⽤⼦类对象。 向同⼀个⽗类的不同⼦类发送同⼀条消息,⾏为不同。
比如:Teacher和Student都是People的子类,代码可以写成下面的样子
为什么使用多态
一、提高代码的可维护性
当软件系统规模变大时,如果没有多态,对于同一类行为的不同实现可能需要在多个地方进行重复的条件判断和不同的方法调用。而使用多态后,只需要在一个统一的接口处进行调用,当需要修改具体的实现时,只需要在相应的子类中进行修改,而不会影响到调用它的其他代码部分。例如,有一个图形绘制系统,其中有不同类型的图形(圆形、矩形、三角形等),如果不使用多态,每次绘制不同图形时都需要根据图形的类型进行不同的方法调用。而使用多态后,可以通过一个统一的绘制方法,根据传入的不同图形对象自动调用相应的绘制实现,这样当需要添加新的图形类型或者修改现有图形的绘制方式时,只需要在相应的图形类中进行修改,不会影响到其他与绘制相关的代码。
二、增强代码的可扩展性
多态使得软件系统更容易扩展新的功能。当需要添加新的类实现某个已有接口或继承某个已有父类时,现有的代码可以无需修改就能够自动适应新的类型。比如在一个动物模拟游戏中,最初只有猫和狗两种动物,随着游戏的发展需要添加新的动物类型如兔子。如果使用了多态,只需要创建兔子类并实现动物的接口或继承动物类,游戏中的其他部分如动物行为控制的代码无需进行任何修改,就可以直接处理兔子这种新的动物类型。
三、实现代码的灵活性
多态允许在运行时根据实际对象的类型来决定调用哪个具体的方法,这为程序提供了很大的灵活性。例如,在一个电商系统中,有不同类型的促销活动(满减、折扣、赠品等),可以定义一个促销策略接口,不同的促销活动实现这个接口。在结算订单时,根据用户选择的不同促销活动,动态地调用相应的促销计算方法,从而实现灵活的促销策略应用。
四、促进代码的复用性
父类或接口可以作为多个子类的通用类型,从而实现代码的复用。比如,定义一个交通工具的父类,其中包含一些通用的方法如启动、停止等。汽车、火车、飞机等子类继承这个父类并实现各自特有的方法。在编写代码时,可以使用交通工具这个父类类型来引用不同的具体交通工具对象,从而复用父类中的通用代码,减少重复编写的工作量。
向上转型
向上转型:⽗类引⽤⼦类对象(⾃动成⽴,缺点是失去调⽤⼦类独有⽅法的能⼒)
父类 对象名=new 子类(); //子类会自动向上转型
例子:
Dog中的代码:
package com.ykq.duotai;
public class Dog extends Animal {
// eat
@Override
public void eat(){
System.out.println("我是一只狗,我喜欢吃奥里给!!!");
}
// 看门 watchDoor()
public void watchDoor(){
System.out.println("狗会看门!!!");
}
}
test类:
Animal animal = new Dog();// 向上转型
// dog 赋值给Animal
animal.eat();
animal.watchDoor(); // 报错
向上转型后该对象只能当成父类对象来用,原来子类中定义的属性和方法就被屏蔽掉不能被调用了。比如狗里有一个【看门】的方法,如果向上转型后作为【动物】类就不能调用dog类独有的【看门】的方法。
总结: 向上转型 从小的转向大的 缺点:不能调用子类里面的特有的方法 .
- 能调用哪些方法看等号的左边。 2. 执行哪些方法看等号的右边。
向下转型
向下转型:⼦类引⽤⽗类对象(强制转换,慎重)
例1:
public static void main(String[] args) {
// Dog
Animal dog = new Dog();
// ⼦类引⽤⽗类对象
Dog dog1 = (Dog) dog;
// 向下转型 可以调用子类里面方法 属性
dog1.watchDoor();
Cat cat = (Cat) dog;
}
此时可以调用子类对象中的方法和属性。[]
注意事项:ClassCastException
对象向下转型时,容易出现类型转换异常
例2:
向上转型--自动发生---目的就是实现多态特点----缺点:无法调用子类特有的方法。
向下转型--强制转换---目的想调用子类特有的功能---缺点: 出现异常。