- 多态的概念
同一个对象,在不同时刻表现出的不同形态。(系统自动识别当前对象的类型,并访问其对应的属性或方法)
多态性体现在方法重载所实现的静态多态性(编译时多态)和方法覆盖所实现的动态多态性(运行时多态)。
例如:猫
可以说猫是动物: Animal c = new Cat();
可以说猫是猫: Cat c = new Cat();
也可以说猫是液体: Liquid c = new Cat();
此时猫在不同时刻表现出了不同的形态,这就是多态。
- 多态存在的必要条件(前提)
- 继承:当一个类具有另一个类的所有数据和方法的时候,就称这两个类之间具有继承关系。
- 继承关系是传递的。继承简化了人民对事物的认识和描述,能清晰体现相关类间的层次结构关系。
- 提供软件复用功能。能见效代码和数据的冗余度,大大增加程序的重用性。
- 通过增强一致性来减少模块间的接口和界面,大大增加程序的易维护性。
- 单一继承机制。仅支持单继承,但可实现多接口。
- 重写:(1)覆盖性重写:子类重写父类的方法,特点是父类中该方法的内容全部舍弃,重新重写该方法。
(2)扩展性重写:保留父类方法原有内容的基础上增加新的内容,可以在子类中使用super调用父类方法。
- 父类引用指向子类对象 parent p = new child();
示例:
public class animal {
public void eat(){
System.out.println(“吃东西”);
}
}
//继承
public class Cat extends Animal {
public void eat(){
//方法重写(overwrite)
System.out.println(“猫吃鱼”);
}
public void playFurball(){
System.out.println(“猫玩毛球”);
}
}
public class AnimalDemo(){
public static void main(){
//父类引用子类对象
Animal c = new cat();
}
}
- 多态的好处和弊端
好处:扩展性强,让代码更灵活,提高代码的复用性
弊端:不能调用子类对象的特有行为(方法)
示例:
//在上一个代码上进行拓展
public void useAnimal(Animal a){
//提高代码的复用性,不用多次书写
//Animal a = new Cat();
//Animal a = new Dog();
- eat();
//不能调用子类对象的特有行为(方法)
//无法调用a. playFurball()
}
public class AnimalDemo{
public static void main(String[] args){
Animal a = new Animal();
Cat c = new Cat();
a.useAnimal(c);
}
}
输出:猫吃鱼