多态的定义:同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
实现多态的技术称为:动态绑定(dynamic binding),是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。
多态的作用:消除类型之间的耦合关系。
多态存在的必要条件:
-要有继承
-调用的方法要经过重写
-父类引用指向子类对象
-编译时和运行时类型不一致,一定会产生多态,否则不会产生多态
实例分析:
-创建Bat子类
public class Bat extends Mammal{
public void eat() {
System.out.println("正在吃东西");
}
@Override
public void move() {
System.out.println("靠翼飞行");
}
}
-创建Mammal父类:
public class Mammal {
String weight = "2.5kg";
public void move() {
System.out.println("正在移动");
}
}
-创建Test类调用
public class Test {
public static void main(String[] args) {
Bat bat = new Bat();//编译时变量为子类类型,所以编译子类的move方法,
// 执行时bat指向的是本类的对象,所以调用的是本类的move方法
bat.move();
double a = 9;//小范围精度的数据可以直接赋值给大范围数据类型变量,java类中也存在
Mammal mammal = new Bat();//父类类型变量 = 子类创建的对象
mammal.move();/*编译时变量为父类类型,所以编译时调用父类中的move方法;
运行时,mammal变量指向子类创建的对象,所以运行时调用的是子类的move方法
编译时和运行时调用的方法不一致,多态,即多种行为状态
父类类型(比如Mammal)的变量(比如mammal)指向子类创建的对象,使用
该变量调用父类中一个被子类重写的方法(比如move方法),则父类中的方法呈现出
不同的行为特征,这就是多态*/
}
}
-编译取决于引用变量,运行取决于引用变量指向的对象
-父类类型变量 = 子类创建的对象(称为上转型对象)
上转型对象特点:
-不能调用子类新增的属性和方法
-若要调用必须进行下转型:
Mammal mammal = new Bat();
Bat b = (Bat)mammal;
b.eat();
-非上转型对象不能下转型
-如果子类成员变量与父类成员变量名字重复,则上转型对象调用的父类的属性