多态
-
编译(看变量类型)时和运行(看对象)时调用的方法不一样——多态——多种行为状态
-
允许将子类类型的指针赋值给父类类型的指针。
-
多态的特点
A、编译时和运行时的变量类型不一致
B、编译时调用的父类方法已经被子类重写
C、形式:父类类名 创建的子类对象名= new 子类类名(); -
上转型对象:父类中的对象指向子类中的对象,子类对象向上转型
特点:上转型对象不能调用子类“新增”(创建对象之后新增)的属性(成员变量)和方法
如果子类中成员变量名和父类中成员变量名一致,则上转型变量调用的时父类的
上转型对象如果要调用“新增”的属性和方法,则必须向下转型
只有上转型变量才能向下转型 -
向下转型形式(参考强制变量类型转换):子类类名 下转型变量名(新的变量) = (子类类名)上转型变量名
向下转型创建了一个新的变量,但是不开辟新的空间
public class Mammal {
public void move() {
System.out.println("It's moving");
}
}
public class bat extends Mammal {
public void move() {
System.out.println("Bat is moving");
}
public void more() {
System.out.println("more");
}
}
public class Test {
public static void main(String[] args) {
bat b= new bat();
b.move();//编译时变量为子类类型,所以编译时调用子类的move方法;运行时,执行bat指向的对象
Mammal up =new bat();//父类类型变量=子类创建的对象
up.move();
//编译时变量为父类类型,所以编译时调用父类中的move方法;
//运行时,mammal变量指向子类创建的对象,所以运行时调用的是子类的move方法
//编译时和运行时调用的方法不一致,多态,即多种行为状态
//ma.more();//上转型变量调用子类中新增的属性和方法,会报错
bat down = (bat)up;//向下转型
down.more();
}
}