多态 (polymorphic)
多[多种]态[状态]基本介绍
方法或对象具有多种形态。是面向对象的第三大特征,多态是建立在封装和继承基础之上的。
对象的多态(核心,困难,重点)
重要的几句话:
(1)一个对象的编译类型和运行类型可以不一致
Animal animal = new Dog();[animal 编译类型是Animal,运行类型是Dog]
(2)编译类型在定义对象时,就确定了,不能改变
animal=new Cat();[animal 的运行类型变成了Cat,编译类型仍然是Animal]
(3)运行类型是可以变化的.
(4)编译类型看定义时=号的左边,运行类型看=号的右边
public class Animal {
public void cry() {
System.out.println("动物在叫。");
}
}
public class Cat extends Animal{
public void cry() {
System.out.println("Cat cry() 小猫喵喵叫");
}
}
public class Dog extends Animal{
public void cry() {
System.out.println("Dog cry() 小狗汪汪叫");
}
}
public class poly {
public static void main(String[] args) {
//体验对象多态特点
// animal 编译类型就是 Animal ,运行类型Dog
Animal animal = new Dog();
//因为运行时,执行到改行时,animal运行类型是Dog,所以cry就是Dog的cry
animal.cry();//小狗汪汗叫
//animal 编译类型Animal,运行类型就是 Cat
animal = new Cat();
animal.cry();//小猫瞄瞄叫
}
}
Dog cry() 小狗汪汪叫
Cat cry() 小猫喵喵叫
向上转型
多态的前提是:两个对象(类)存在继承关系多态的向上转型
- 本质:父类的引用指向了子类的对象
- 语法:父类类型 引用名=new 子类类型();
- 特点:编译类型看左边,运行类型看右边。
可以调用父类中的所有成员(需遵守访问权限),不能调用子类中特有成员;
最终运行效果看子类的具体实现!(子类中有则调用子类中的方法或属性(父类中也要有,不要就是特有成员,无法调用),没有就找父类,按继承方式一级一级往上找)
向下转型
- 语法:子类类型 引用名=(子类类型) 父类引用;(Cat cat= Cat animal)(animal 指向cat ,相当于cat的另一个名字叫animal)
- 只能强转父类的引用,不能强转父类的对象(一个人换个名字)
- 要求父类的引用必须指向的是当前目标类型的对象(猫就是猫,不能不成狗,所以如果下面还有【Dog dog=Dog animal】就会报错)
- 当向下转型后,可以调用子类类型中所有的成员