(1)面向对象共有三个特征:封装、继承、多态
多态存在的三个必要条件:继承、重写、父类引用指向子类对象
现实中的事物经常会出现多种形态。如学生是人的一种,一个具体的学生张三,既是学生又是人,即出现了两种形态。java作为面向对象的语言,同样可以描述一件事物的多种形态,如一个Student类继承了Person类,一个Studen对象既是Student又是Person。
(2)多态调用的三种形式
普通类的多态】
Studen s = new Student();
Person p = new Student();
一个子类对象既可以赋给它的本类类型,也可以赋给它的父类类型
抽象类的多态】
// 抽象类Animal 子类Cat
Animal a = new CAt();
接口多态】
接口 变量 = new 实现类();
(3)多态中,成员特点
成员变量】
编译的时候,参考父类中有没有这个变量,如果有编译成功,没有编译失败
运行的时候,运行的是父类中的变量值
成员方法】
编译的时候,参考父类中有没有这个方法,如果有编译成功,没有编译失败
运行的时候,静态方法,运行父类中的静态方法(因为静态属于类,不属于对象);非静态方法时,运行的是子类的重写方法。
(4)多态的优点:
1)消除类型之间的耦合关系
2)可替换性
3)配合继承与方法重写提高了代码的复用性与扩展性
4)接口性
5)简化性
6)灵活性
(5)java程序(多态转型案例)
/*
* 动物类
* 方法:eat
*/
public class Animal {
public void eat(){
System.out.println("动物吃饭");
}
}
/*
* Dog类继承Animal
* 方法:eat work
*/
public class Dog extends Animal {
public void eat(){
System.out.println("小狗在吃饭");
}
public void work(){
System.out.println("看家");
}
}
/*
* Cat类继承Animal
* 方法: eat work
*/
public class Cat extends Animal {
public void eat(){
System.out.println("小猫在吃饭");
}
public void work(){
System.out.println("逮老鼠");
}
}
/*
* 测试类
*
*/
public class Test {
public static void main(String[] args) {
show(new Cat()); // 以Cat对象调用show
Animal an = new Cat(); // 向上转型
an.eat(); // 调用的是子类父类共有的方法,运行的是子类中的方法
//an.work(); 编译不成功
Cat c = (Cat)an; // 向下转型
c.eat(); // 调用的是Cat.eat()
c.work(); // 调用的是Cat.work()
}
public static void show(Animal an){
an.eat();
// 关键字instanceof :用于判断一个引用类型的变量,是不是这个类型的对象
if(an instanceof Cat){ // 猫做的work
Cat c = (Cat)an; // 向下转型
c.work();
}else if(an instanceof Dog){
Dog d = (Dog)an;
d.work();
}
}
}